作为我在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个或更少的字符,那么这段代码可以工作,我会为数据库中的每个字段返回一行。
使用长文件名,我知道返回的连接是有效的,因为我可以使用它来填充数据集,如下所示:
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,并从列中推断出架构。
答案 0 :(得分:2)
根据MSDN,文件夹代表数据库,文件代表表格。您应该使用目录路径,不包括连接字符串中的文件名,以及表的名称作为GetOleDbSchemaTable限制的一部分。
答案 1 :(得分: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
或install Microsoft OLE DB Provider for Visual FoxPro 9.0 from here
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);
答案 2 :(得分:0)
fileNameNoExt是否包含短文件名版本?此外, MyLongF~1 是9个字符,而不是8个字符。
答案 3 :(得分:0)
如果您有一个(可能很小的)dbf文件,您可以解决将dbf文件复制到别处的问题,并打开副本而不是原始文件。
答案 4 :(得分:0)
我相信DataSource应该代表包含.DBF文件的目录。每个.DBF文件都对应于该目录中的一个表。
我的猜测是c:\ MyLongF~1是包含与MyLongF~1#DBF
对应的文件名的目录的简称你能核实是否是这种情况吗?