获取 "System.InvalidOperationException" 尝试打开 OLE DB 连接时

Getting "System.InvalidOperationException" When trying to open and OLE DB connection

我正在尝试连接到我为测试目的使用 OLE DB 下载的 Visual FoxPro 数据库,这是我的代码:

private void ReadMyData() {
     String dbProvider = "Provider=.NET Framework Data Provider for OLE DB;";
     String dbSource = "Data Source=VFPOLEDB.C:\USERS\X\DESKTOP\LOG;";
     String connectionString = dbProvider + dbSource;
     OleDbConnection FPDBConn = new OleDbConnection(connectionString);

     OleDbCommand FPDBCmd;
     string sql = null;

     sql = "Select * from clogbook";

     try {
         FPDBConn.Open();
         FPDBCmd = new OleDbCommand(sql, FPDBConn);
         OleDbDataReader FPDBReader = FPDBCmd.ExecuteReader();
         while (FPDBReader.Read()) {
             Debug.Write(FPDBReader.GetInt32(0) + ", " + FPDBReader.GetString(1));
         }
         FPDBReader.Close();
         FPDBCmd.Dispose();
         FPDBConn.Close();
     } catch (Exception ex)
      {
           Debug.Write("Can not open connection ! " + ex);
      }
 }

问题是我得到 "System.InvalidOperationException: The '.NET Framework Data Provider for OLE DB' provider is not registered on the local machine."

我在谷歌上搜索它并发现了这个 msdn page 说异常 "InvalidOperationException" 有条件 "The connection is already open." 我认为在这种情况下不会发生。

我怎样才能让它工作?

PS: 接受不同的建议以建立此连接。

为了连接到 VFP,我强烈建议下载 Visual Foxpro OleDb Provider

然后,连接字符串的格式将类似于...

string connectionString = @"Provider=VFPOLEDB.1;Data Source=C:\YourDirectory\"; 

连接应该指向 table 所在的 PATH,正如您当前所拥有的...很多时候人们尝试连接到特定的 TABLE,但是一旦路径建立,您可以从该文件夹(或子文件夹,如果可用)中的任何 table 进行查询。

应该让你更进一步......

您应该按照 DRapp 的建议下载并使用 VFPOLEDB。下面是一个使用示例数据库 Northwind 数据的示例:

private void ReadMyData()
{
  var builder = new OleDbConnectionStringBuilder();
  builder.Provider = "VFPOLEDB";
  builder.DataSource = @"C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Northwind";

  string sql = "Select * from Customers where Country like ?";

  using (OleDbConnection con = new OleDbConnection(builder.ConnectionString))
  using (OleDbCommand cmd = new OleDbCommand(sql, con))
  {
    cmd.Parameters.AddWithValue("@country", "USA");
    try
    {
      con.Open();
      var reader = cmd.ExecuteReader();
      while (reader.Read())
      {
        Debug.WriteLine("{0}, {1}",
          reader["CustomerId"],
          reader["CompanyName"]);
      }
      con.Close();

    }
    catch (Exception ex)
    {
      Debug.Write("Can not open connection ! " + ex);
    }
  }
}

注意参数不是命名而是位置。

PS:同时查看 Tom Brothers 的 Linq To VFP, VFP Entity Framework and VFP Client for ADO.Net