Как закрыть таблицу с провайдером VFP OLE DB - PullRequest
0 голосов
/ 30 октября 2019

Я пишу некоторое программное обеспечение на 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. , но я не могу найти способ снять эту эксклюзивную блокировку без закрытия всего соединения, чего я пытаюсь избежать.

1 Ответ

0 голосов
/ 31 октября 2019

Я не вижу точки, открывающей соединение исключительно, а затем использующего адаптер для заполнения таблицы, после чего вы хотите снять блокировку. Во-первых, вам не нужно соединение, адаптер открывает и закрывает соединение по мере необходимости:

DataTable table = new DataTable();
new OleDbDataAdapter("SELECT * FROM tran", 
      @"Provider=vfpoledb;Data Source=J:\epdata;Deleted=off")
  .Fill(table);
...