我在打开 DBF 文件时遇到问题 - 我需要打开它,读取所有内容并处理它。我尝试了几种解决方案(ODBC/OLEDB)、几种连接字符串,但到目前为止没有任何效果。
问题是,当我执行 SQL 命令以从文件中获取所有内容时,没有返回任何内容 - 没有行。更奇怪的是,正在打开的 DBF 文件的内容被删除了。
查看我的代码:
public override bool OpenFile(string fileName, string subFileName = "")
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path.GetDirectoryName(fileName) + ";Extended Properties=dBASE IV;User ID=;Password=;");
try
{
if (con.State == ConnectionState.Closed) { con.Open(); }
OleDbDataAdapter da = new OleDbDataAdapter("select * from " + Path.GetFileName(fileName), con);
DataSet ds = new DataSet();
da.Fill(ds);
con.Close();
int i = ds.Tables[0].Rows.Count;
return true;
}
catch
{
return false;
}
}
我调试了代码并观察了在 Windows 资源管理器中打开的文件。当它到达这一行时:
da.Fill(ds);
文件的大小下降到只有几个字节(从数百 kB)。
我的下一个想法是将 DBF 文件设为只读。然而,这会导致“来自外部驱动程序的意外异常”。
所以我的问题是 - 到底是什么?我确定该文件没有损坏,它是从某个数据库直接导出的。 (不,我无权访问该数据库)。我也可以在 MS Office 中打开该文件,没问题。
我无法共享 DBF 文件 - 它包含 secret 数据。
最佳答案
有两件事...仅仅因为它的 .DBF 文件扩展名可能意味着它是 Dbase IV 文件。它实际上可能是 Visual Foxpro 的。也就是说,我会考虑从 Microsoft download 下载和安装 Visual Foxpro OleDB 驱动程序。 .接下来,OleDbConnection 指向具有实际表的路径(您已经有了)。
查询本身不应该关心扩展名,所以我会更改您的调用以通过“Path.GetFileNameWithoutExtension”获取刚刚的名称
可能是两者的结合。
VFP 提供程序的连接字符串
"Provider=VFPOLEDB.1;Data Source=" + FullPathToDatabase
关于C# 打开 DBF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7997641/