小编use*_*748的帖子

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

作为我在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);
Run Code Online (Sandbox Code Playgroud)

要通过此异常,下一步是使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

这将返回没有行的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);
Run Code Online (Sandbox Code Playgroud)

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

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

c# oledb dbf

6
推荐指数
1
解决办法
4378
查看次数

标签 统计

c# ×1

dbf ×1

oledb ×1