2010-02-17 81 views
3

我使用VFPOLEDB驅動程序讀取DBF文件,我不斷收到這個錯誤,我不知道爲什麼和如何解決問題:閱讀DBF與VFPOLEDB司機

提供商無法確定十進制值。例如,該行剛剛創建,Decimal列的默認值不可用,並且使用者尚未設置新的Decimal值。

這是代碼。我將此例程稱爲返回DBF文件的DataSet並將數據顯示在DataGridView中。

public DataSet GetDBFData(FileInfo fi, string tbl) 
    { 
     using (OleDbConnection conn = new OleDbConnection(
     @"Provider=VFPOLEDB.1;Data Source=" + fi.DirectoryName + ";")) 
     { 
      conn.Open(); 
      string command = "SELECT * FROM " + tbl; 
      OleDbDataAdapter da = new OleDbDataAdapter(command, conn); 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
      return ds; 
     } 
    } 

回答

0

我最終通過獲取表模式,然後在select語句中將所有非字符字段轉換爲varchar來解決了這個問題。足以預覽表格的內容。

0

如果你從你的GridView添加行,它不一定使用默認值,而是空值,所以你可能需要預先設定的默認值,或設置架構不允許爲空。

查詢完成,並基於該列中的數據類型部隊設置後,你可以通過列自動化,如

foreach (DataColumn oDC in YourDataSet.Tables[0].Columns) 
{ 
    if (oDC.DataType.ToString().Contains("String")) 
    oDC.DefaultValue = ""; 
    else if (oDC.DataType.ToString().Contains("Int32")) 
    oDC.DefaultValue = 0; 
    else if (oDC.DataType.ToString().Contains("DateTime")) 
    oDC.DefaultValue = DateTime.MinValue; 
} 

這些都只是默認設置爲3種,但也可能有其他類似布爾值,小數,float,無論如何,只需添加到if/else並放置任何「默認」值即可。它可以幫助在添加新行時否則「NULL」值被注入。

+0

如何預設我的默認值?我正在嘗試預覽任意DBF文件的內容。 –

+0

感謝您的建議,但我甚至無法獲取DataSet,並且我的代碼在da.Fill(ds)處崩潰; –

+0

看到我的代碼示例在另一篇文章http://stackoverflow.com/questions/2184490/search-in-dbf-file-using-idx-file/2184598#2184598主題標題被搜索在DBF文件使用.idx文件 – DRapp

0

這是一個已知的問題。 特別是,如果您需要選擇所有列,它是更舒適:

Select * from some_table 

一個工作解決方案是使用其他供應商,例如Microsoft.Jet.OLEDB.4.0。 示例連接字符串可以在這裏找到:http://docs.30c.org/conn/dbf-foxpro.html