6

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

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

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 个或更少的字符,则此代码有效,并且我为数据库中的每个字段返回一行。

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

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);

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

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

4

5 回答 5

2

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

于 2009-06-08T23:34:34.773 回答
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

从此处安装 Microsoft OLE DB Provider for Visual FoxPro 9.0

        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);
于 2009-04-14T21:47:17.630 回答
0

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

我的猜测是 c:\MyLongF~1 是包含对应于 MyLongF~1#DBF 的文件名的目录的简称

你能验证是否是这种情况吗?

于 2009-06-10T16:31:20.320 回答
0

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

于 2009-06-04T04:06:54.273 回答
0

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

于 2009-06-09T15:15:04.653 回答