Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与FoxPro数据库的共享OLEDB连接_C#_Datatable_Visual Foxpro_Foxpro_Oledbconnection - Fatal编程技术网

C# 与FoxPro数据库的共享OLEDB连接

C# 与FoxPro数据库的共享OLEDB连接,c#,datatable,visual-foxpro,foxpro,oledbconnection,C#,Datatable,Visual Foxpro,Foxpro,Oledbconnection,我试图将一个FoxPro表读入一个c数据表,问题是当我从中读取数据时,我需要在其他地方打开它。我一直在寻找一种方法,使连接共享或类似的东西。任何帮助都将不胜感激。下面是我现在使用的方法: public DataTable ReadBulkDBC(string dbfFile, string query, int maxRows, string dynamicValue) { DataTable dt = new DataTable(); using (OleDbConnectio

我试图将一个FoxPro表读入一个c数据表,问题是当我从中读取数据时,我需要在其他地方打开它。我一直在寻找一种方法,使连接共享或类似的东西。任何帮助都将不胜感激。下面是我现在使用的方法:

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=设置空值开\r\n设置删除开\r\n设置独占关; command.CommandType=CommandType.Text; command.CommandText=CommandText; command.ExecuteNonQuery


此代码在对连接执行任何其他操作之前执行。

如果看不到变量中的值,则有一个dbfFile参数。如果这是实际表的名称,那么这就是问题所在。连接字符串应仅指向.dbf文件所在的路径。一旦连接到路径,您应该能够从该文件夹中的任何.DBF进行查询

这就是你的问题所在吗

然后我问你一个问题。。。VFP版本的源应用程序是否实际将文件置于独占模式且未共享?如果那是独占的,你就不能做别的事情了

但是,如果您连接到PATH\TableName.dbf,该连接将永远不会打开,因为您无法连接到.dbf

如果您有权访问VFP,并且可以仅出于健全性检查的目的。。。创建一个新表并向其中添加一条简单记录。将它放在与您尝试连接的其他表所在的路径相同的路径中。然后尝试从新表中进行查询。正在运行的应用程序不知道这个表,因此永远不会打开它。这样,您在尝试打开/查询它时应该没有问题

从VFP内部

CD "path to your production data"
create table _TempFileForCSharp ( testfield c(10), intfield i )
use

现在,从C,尝试对表_TempFileForCSharp运行一个查询,只需确保连接到.dbf所在的路径,不要连接到实际的.dbf

其他应用程序也应该以共享方式打开FoxPro表,比如在打开表之前使用SET EXCLUSIVE OFF,或者在USE命令中添加SHARED关键字;它要求一个开放的连接,这就是我不能做的。@DiDiierfuentes您是否有异常堆栈跟踪或类似的错误消息详细信息可以共享?在使用文件时,我尝试访问该文件时遇到的异常非常简单:System.Data.OleDb.OledBeException类型的第一次异常发生在System.Data.dll中。其他信息:无法打开文件c:\…\file.dbc。我明白了,它是一个数据库容器,您无法打开。我所处理的遗留应用程序大多使用文件夹中的空闲表,而没有将它们与DBC容器关联。也许您可以通过直接从表所在的文件夹中打开表来解决DBC问题。不,不是这样,问题是数据库/表在其他地方打开,它无法访问,因为我无法设置共享连接。@DidierFuentes,请参阅反馈的修订我更改了连接字符串以指向路径,结果相同。另一个问题是,现在打开文件的另一个应用程序是我的计算机中的VFP,使用USE shared。如果我在VFP中关闭文件,我的应用程序可以工作,但即使VFP正在使用它,它也应该能够打开它。如果我尝试直接打开该文件,而不是将其作为数据库打开,即使VFP打开了它,我也能够访问该文件,因此我认为问题在于应用程序中的连接。