我正在用C#编写一些软件,这些软件将随着时间的推移对Visual FoxPro数据文件执行查询。我需要能够关闭表,尤其是那些以独占方式打开的表(连接字符串中的"Mode=Share Exclusive"(,但我似乎唯一能做到这一点的方法是关闭整个OleDbConnection。
VFP OLE DB Provider支持VFP本身的一些语法,但在标准VFP中关闭表的命令,如USE,要么不起作用,要么引发异常(我现在记不起是哪个命令引发了异常(。
目前,一个类的每个实例都有自己的OleDbConnection属性,因此如果需要,我可以关闭它并释放它工作的表。虽然这很有效,但它不是最佳的,我更喜欢有一个连接实例。
// Elsewhere, ideally one connection for the entire process,
// if I'm able to release locks
public OleDbConnection Connection { get; } = new OleDbConnect();
// ...
if(Connection.State == ConnectionState.Closed) {
Connection.ConnectionString = "Provider=vfpoledb.dll;Data Source=J:\epdata\;Mode=Share Exclusive"
Connection.Open();
}
OleDbCommand cmd = new OleDbCommand("SET DELETED OFF", Connection);
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT * FROM tran";
OleDbDataAdapter adap = new OleDbDataAdapter(cmd);
DataTable table = new DataTable();
adap.Fill(table);
// Something here to release the lock on the tran table
这将选择数据并锁定表以供当前OleDbConnection独占使用,但我找不到任何方法在不关闭整个连接的情况下释放独占锁定,我正在努力避免这样做。
我没有看到以独占方式打开连接,然后使用适配器填充表,然后您想要释放锁定的点。首先你不需要连接,适配器根据需要打开和关闭连接:
DataTable table = new DataTable();
new OleDbDataAdapter("SELECT * FROM tran",
@"Provider=vfpoledb;Data Source=J:epdata;Deleted=off")
.Fill(table);