我在打开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文件 - 它包含机密数据。
答案 0 :(得分:12)
两件事......仅仅因为它的.DBF文件扩展名可能在晚上意味着它是一个Dbase IV文件。它实际上可能是Visual Foxpro的。也就是说,我会考虑从Microsoft download下载并安装Visual Foxpro OleDB驱动程序。接下来,OleDbConnection指向具有实际表的路径(您已经拥有该表)。
查询本身,不应该关心扩展,所以我会改变你的调用,然后通过“Path.GetFileNameWithoutExtension”获取名称
这可能是两者的结合。
VFP提供程序的连接字符串
"Provider=VFPOLEDB.1;Data Source=" + FullPathToDatabase
答案 1 :(得分:2)
这不是确切的答案,但它可以帮助您找到问题。
尝试提供内联连接字符串并选择查询以确保问题不在于构建它们。抓住异常并检查它的详细信息。
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\folder;Extended Properties=dBASE IV;User ID=;Password=;"); // give your path directly
try
{
con.Open();
OleDbDataAdapter da = new OleDbDataAdapter("select * from tblCustomers.DBF", con); // update this query with your table name
DataSet ds = new DataSet();
da.Fill(ds);
con.Close();
int i = ds.Tables[0].Rows.Count;
return true;
}
catch(Exception e)
{
var error = e.ToString();
// check error details
return false;
}