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