我正试图将FoxPro表读取到c#DataTable中,问题是我在读取时需要将其打开到其他地方。我一直在寻找一种方法来共享连接或类似的东西。如有任何帮助,我们将不胜感激。这是我现在使用的方法:
public DataTable ReadBulkDBC(string dbfFile, string query, int maxRows, string dynamicValue)
{
DataTable dt = new DataTable();
using (OleDbConnection connection = new OleDbConnection(@"Provider=VFPOLEDB.1; Mode=Share Deny None; Exclusive=OFF; Data Source=" + dbfFile))
{
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = query;
dt.Columns.Add(new DataColumn("updateId", typeof(int)));
if (!dbfFile.Contains("con_compania")) { dt.Columns.Add(new DataColumn("dynamic", typeof(string))); }
dt.Columns.Add(new DataColumn("fechasync", typeof(DateTime)));
OleDbDataAdapter oda = new OleDbDataAdapter(command);
//DataSet ds = new DataSet();
oda.Fill(dt);
//dt = ds.Tables[0];
}
return dt;
}
我过去曾成功地在OleDbCommand/Connection上调用SET EXCLUSIVE OFF,然后再将其用于数据集操作。
我使用了如下代码作为"初始化"连接的一部分:
string commandText = "SET NULL ONrnSET DELETED ONrnSET EXCLUSIVE OFF";
command.CommandType = CommandType.Text;
command.CommandText = commandText;
command.ExecuteNonQuery();
此代码在对连接执行任何其他操作之前执行。
由于看不到变量中的值,您就有了一个参数"dbfFile"。如果这是实际TABLE的名称,那么这就是问题所在。您的CONNECTION STRING应该只指向.dbf文件所在的PATH。连接到PATH的连接后,您应该能够从该文件夹中的任何.DBF进行查询。
这就是你的问题吗?
然后有一个问题要问你。。。SOURCE应用程序(VFP版本)是否确实将文件置于独占模式而不共享?如果这是独家的,你就不能做任何其他事情。
但是,如果您的连接是到PATH\TableName.dbf,则该连接将永远不会打开,因为您无法连接到.dbf…
如果您可以访问VFP,并且可以仅出于健全性检查目的。。。创建一个新表,并向其中添加一条简单记录。将其放在与要连接的另一个表所在的路径相同的路径中。然后尝试从THE NEW表进行查询。运行中的应用程序不知道这个表,因此永远不会打开它。这样你应该不会有任何问题尝试打开/查询它
从VFP内部。。。
CD "path to your production data"
create table _TempFileForCSharp ( testfield c(10), intfield i )
use
现在,从C#中,尝试对表"_TempFileForCSharp"运行查询,只需确保连接到.dbf所在的PATH,不要连接到实际的.dbf