【问题标题】:How to close a table with the VFP OLE DB Provider如何使用 VFP OLE DB 提供程序关闭表
【发布时间】:2019-10-30 17:12:52
【问题描述】:

我正在用 C# 编写一些软件,随着时间的推移对 Visual FoxPro 数据文件执行查询。我需要能够关闭表,尤其是那些以独占方式打开的表(连接字符串中的“Mode=Share Exclusive”),但我似乎可以这样做的唯一方法是关闭整个 OleDbConnection。

VFP 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 独占使用,但我无法找到任何方法来释放该独占锁而不关闭整个连接,我试图避免这种情况不得不做。

【问题讨论】:

    标签: c# .net oledb visual-foxpro oledbconnection


    【解决方案1】:

    我没有看到以独占方式打开连接然后使用适配器填充表格,之后您想要释放锁定的点。一开始你不需要连接,适配器会根据需要打开和关闭连接:

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

    【讨论】:

    • 连接也用于对数据源执行更新。此处使用数据适配器填充表只是锁定表的示例。它在示例中没有关闭,因为稍后会再次需要它。有些查询将以独占模式运行,有些则以共享模式运行。问题是在独占模式下打开表会锁定表,直到连接本身关闭,我一直在寻找比为我使用的每个表都有一个专用连接更好的东西。
    • 您可以在共享模式下更新。在连接关闭之前它被锁定是完全正常的。
    • 共享与独占模式不是我的问题。以共享或独占模式打开表是基于用户输入的,何时关闭表以便其他进程可以使用它们,所以我不能总是使用共享模式。我需要一个可以关闭表格的东西,不管它是在哪种模式下打开的。但我似乎找不到,所以我想我使用的连接数比我想要的多得多。
    • 我不明白你对很多连接的担忧。这是一个单一的连接,打开,做你的工作,关闭。
    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多