当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在长名称dbf文件上使用GetOleDbSchemaTable方法》经验,为你挑选了0个好方法。

作为我在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个或更少的字符,那么此代码可以工作,我会为数据库中的每个字段返回一行.

使用长文件名,我知道返回的连接是有效的,因为我可以使用它来填充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);

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

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有