如何在长名称dbf文件上使用GetOleDbSchemaTable方法

时间:2009-03-30 18:04:43

标签: c# oledb dbf

作为我在C#中工作的项目的一部分,我需要读取.dbf文件。我想要做的第一件事是从文件中获取架构表。我的代码只要文件名(没有扩展名)不超过8个字符就可以使用。

例如,假设我有一个名为MyLongFilename.dbf的文件。以下代码不起作用;它抛出以下异常:“Microsoft Jet数据库引擎找不到对象'MyLongFilename'。确保对象存在,并正确拼写其名称和路径名称。“

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);

要超越此异常,下一步是使用OldDbConnection喜欢的名称('MyLongF~1'而不是'MyLongFilename'),这导致:

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);

这确实成功返回了OleDbConnection。现在要获取模式表,我尝试以下方法:

connection.Open();
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
    new object[] { null, null, fileNameNoExt, null });

这将返回没有行的DataTable。如果我将文件名重命名为8个或更少的字符,那么这段代码可以工作,我会为数据库中的每个字段返回一行。

使用长文件名,我知道返回的连接是有效的,因为我可以使用它来填充数据集,如下所示:

string selectQuery = "SELECT * FROM [MyLongF~1#DBF];";
OleDbCommand command = new OleDbCommand(selectQuery, connection);
connection.Open();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = command;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);

这使我返回一个包含DataTable的DataSet,其中包含dbf文件中的所有数据。

所以问题是如何才能获得长命名的dbf文件的模式表?当然,我可以通过重命名/复制文件来解决这个问题,但这是一个我不想做的黑客攻击。我也不想用前1个记录填充DataSet,并从列中推断出架构。

5 个答案:

答案 0 :(得分:2)

根据MSDN,文件夹代表数据库,文件代表表格。您应该使用目录路径,不包括连接字符串中的文件名,以及表的名称作为GetOleDbSchemaTable限制的一部分。

答案 1 :(得分:1)

好吧,我认为连接应该是

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);

另一个是,也许你应该和其他提供商一起尝试,在我这样使用的时候我提前了很多:

string cxn = "PROVIDER=VFPOLEDB.1;Data Source=C:\;Extended Properties=dBASE 5.0";

但你应该安装VFP 7

install Microsoft OLE DB Provider for Visual FoxPro 9.0 from here

        const string connectionString = @"Provider = vfpoledb; Data Source = {0}; Collating Sequence = general;";
        OleDbConnection conn = new OleDbConnection(string.Format(connectionString, dirName));
        conn.Open();
        OleDbCommand cmd = new OleDbCommand(string.Format("select * from {0}", fileName), conn);

答案 2 :(得分:0)

fileNameNoExt是否包含短文件名版本?此外, MyLongF~1 是9个字符,而不是8个字符。

答案 3 :(得分:0)

如果您有一个(可能很小的)dbf文件,您可以解决将dbf文件复制到别处的问题,并打开副本而不是原始文件。

答案 4 :(得分:0)

我相信DataSource应该代表包含.DBF文件的目录。每个.DBF文件都对应于该目录中的一个表。

我的猜测是c:\ MyLongF~1是包含与MyLongF~1#DBF

对应的文件名的目录的简称

你能核实是否是这种情况吗?