在读取dbf文件时,Microsoft jet数据库引擎无法找到对象

时间:2015-11-13 06:21:26

标签: c# oledb dbf

我面临着非常奇怪的问题。我编写了通过oledb连接读取dbf文件的类。我从互联网上下载了dbf文件,它正在正确读取所有数据。

DBF文件位置:E:\ Projects \ SLAVE.DBF

我正面临以下两个问题

1)当我尝试读取其他dbf文件时,它只读取其表字段。它不是读取表字段数据。 E:\Projects\line75.dbf

2)我面临的另一个问题当我将这些文件放在位置时我有DBF文件然后我得到例外

  

microsoft jet数据库引擎找不到所需的对象。你是   缺少一些指令或路径。 E:\Projects\SDW_plnParcel.dbf

我完全很困惑,为什么它正在阅读从互联网上下载的SLAVE.DBF正确,为什么它没有阅读line75.dbf的表格数据以及为什么它会在SDW_plnParcel.dbf.上抛出异常

我的类和这个类的一个函数如下:

public class dbfHandler
{
    public dbfHandler()
    {
        this.dbfTable = new DataTable();
    }
    public void initconnection(String filepath) // initialise dbconnection
    {
        String[] splitString = filepath.Split('\\');
        this.filename = splitString[splitString.Length - 1];
        splitString = splitString.Where(w => w != splitString[splitString.Length - 1]).ToArray();
        String folderPath = String.Join("\\", splitString);
        this.dbConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + folderPath + ";Extended Properties=dBase III");
        this.dbConnection.Open();
    }
    public List<String> getcolumnvalues(int fieldIndex, List<int> rowIndexes)
    {
        List<String> columnvalues = new List<string>();
        try
        {
            if(this.dbConnection.State == ConnectionState.Open)
            {
                string mySQL = "select * from " + this.filename;  // dbf table name
                OleDbCommand MyQuery = new OleDbCommand(mySQL, this.dbConnection);
                OleDbDataReader reader = MyQuery.ExecuteReader();
                int rowCount = 0;
                while(reader.Read())
                {
                    bool match = rowIndexes.Any(item => item == rowCount);
                    if(match == true)
                    {
                        String value = reader.GetValue(fieldIndex).ToString();
                        columnvalues.Add(value);
                    }
                    rowCount++;
                }
                reader.Close();
            }
        }
        catch(Exception e)
        {
            throw e;
        }
        return columnvalues;
    }
    private String filename;
    private DataTable dbfTable;
    private OleDbConnection dbConnection;
}

1 个答案:

答案 0 :(得分:1)

在处理.DBF文件时,我总是使用Microsoft's Visual Foxpro OleDb Provider

获得更好的结果

简化格式的连接字符串

var connString = @"Provider=VFPOLEDB.1;Data Source=C:\SomePathToData;";

现在,不是做数据阅读器 - 只是为了确保你能看到你想要的东西,尝试使用DataAdapter ......

var da = new OleDataAdapter( yourSqlCmdObject, yourConnection)
var dt = new DataTable();
da.Fill(dt);

它应该将查询中的所有列和所有行都拉到正确的数据列类型中...然后你可以遍历所有的列名,行等。

foreach( DataColumn dc in dt.Columns )
   var tmp = dc.ColumnName;

foreach( DataRow dr in dt.Rows )
{
   object x = dr[0];   // get VALUE from column 0
   x = dr["SpecificColumn"];   // if you KNOW the column name
}

其中,您可以根据需要进行调整。但是,如果您只需要一个SPECIFIC列(或有限列),请更改您的查询以量化该列。

Select OneField from YourTable...