C#打开DBF文件

时间:2011-11-03 15:37:08

标签: c# .net odbc oledb dbf

我在打开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文件 - 它包含机密数据。

2 个答案:

答案 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;
}