作为我在 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 并从列中推断出架构。