C#打开DBF文件

Tom*_*ška 7 .net c# oledb odbc 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;
    }             
}
Run Code Online (Sandbox Code Playgroud)

我调试了代码并在Windows资源管理器中观看了文件正在打开.当它达到这条线时:

da.Fill(ds);
Run Code Online (Sandbox Code Playgroud)

文件的大小只下降到几个字节(从数百KB).

我的下一个想法是让DBF文件只读.然而,这会导致"来自外部驱动程序的意外异常".

所以我的问题是 - 到底是什么?我确定文件没有损坏,它是从某些DB直接导出的.(不,我无法访问该数据库).我也可以在MS Office中打开该文件没问题.

我无法共享DBF文件 - 它包含机密数据.

DRa*_*app 12

两件事......仅仅因为它的.DBF文件扩展名可能在晚上意味着它是一个Dbase IV文件.它实际上可能是Visual Foxpro的.也就是说,我会考虑从Microsoft下载下载和安装Visual Foxpro OleDB驱动程序.接下来,OleDbConnection指向具有实际表的路径(您已经拥有该表).

查询本身,不应该关心扩展,所以我会改变你的调用,然后通过"Path.GetFileNameWithoutExtension"获取名称

它可能是两者的结合.

VFP提供程序的连接字符串

"Provider=VFPOLEDB.1;Data Source=" + FullPathToDatabase
Run Code Online (Sandbox Code Playgroud)


Dam*_*ith 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;
}
Run Code Online (Sandbox Code Playgroud)