簡體   English   中英

Microsoft jet 數據庫引擎在讀取 dbf 文件時找不到對象

[英]The Microsoft jet database engine could not find object while reading dbf file

我面臨着非常奇怪的問題。 我已經編寫了通過oledb連接讀取 dbf 文件的類。 我已經從互聯網上下載了 dbf 文件,它正在正確讀取所有數據。

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

我面臨以下兩個問題

1) 當我嘗試讀取其他 dbf 文件時,它只讀取其表字段。 它不是讀取表字段數據。 E:\\Projects\\line75.dbf

2)我面臨的另一個問題是,當我將這些文件放在適當的位置時,我有 DBF 文件,然后我遇到了異常

microsoft jet 數據庫引擎未找到所需的對象。 您是否缺少某些指令或路徑。 E:\\Projects\\SDW_plnParcel.dbf

我很困惑為什么它正確讀取從 Internet 下載的SLAVE.DBF ,為什么它不讀取line75.dbf TABLE FIELDS DATA 以及為什么它在SDW_plnParcel.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;
}

在處理 .DBF 文件時,我總是有更好的結果與Microsoft 的 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
}

其中,您可以根據需要進行調整。 但是,如果您只需要一個特定的列(或有限的列),請更改您的查詢以對其進行量化。

Select OneField from YourTable...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM