Я пишу некоторое программное обеспечение на C #, которое будет выполнять запросы к файлам данных Visual FoxPro с течением времени. Мне нужно иметь возможность закрывать таблицы, особенно те, которые открываются исключительно («Mode = Share Exclusive» в строке подключения), но единственный способ, которым я могу это сделать, - закрыть всю OleDbConnection.
Поставщик VLE OLE DB поддерживает некоторый синтаксис самого VFP, но команды, которые закрывают таблицу в стандартном VFP, например, USE, либо не работают, либо выдают исключение (я не могу вспомнить, какая команда вызвала исключение вмомент).
В настоящее время каждый экземпляр класса имеет свое собственное свойство OleDbConnection, поэтому, если мне нужно, я могу закрыть его и освободить таблицу, с которой он работает. Хотя это работает, это не оптимально, и я бы предпочел иметь 1 экземпляр подключения.
// 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. , но я не могу найти способ снять эту эксклюзивную блокировку без закрытия всего соединения, чего я пытаюсь избежать.