使用VFPOLEDB驱动程序读取DBF

时间:2010-02-17 02:37:22

标签: dataset oledb dbf

我正在使用VFPOLEDB驱动程序来读取DBF文件并且我一直收到此错误,我不知道为什么以及如何解决问题:

  

提供商无法确定十进制值。例如,刚刚创建了行,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;
    }
}

4 个答案:

答案 0 :(得分:7)

我在这里找到了解决方案: Error reading certain numeric values with VFPOLEDB driver

SELECT CAST(FieldName As NUMERIC(11, 3)) From TableName

答案 1 :(得分:0)

如果从gridview中添加一行,则它不一定使用默认值,而是使用NULL,因此您可能需要预先设置默认值,或将架构设置为NOT Allow Nulls。

您可以在查询完成后自动完成列,并根据列数据类型强制默认,例如

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个默认类型,但可能有其他类似boolean,decimal,float等等,只需添加到if / else中并放置任何“默认”值。它可能有助于在添加新行时注入“NULL”值。

答案 2 :(得分:0)

我终于通过获取表模式然后在select语句中将所有非字符字段强制转换为varchar来解决问题。足以预览表格的内容。

答案 3 :(得分:0)

这是一个已知问题。 特别是,如果您需要选择所有列,它会更舒适:

Select * from some_table

一个有效的解决方案是使用其他提供程序,例如Microsoft.Jet.OLEDB.4.0。 可以在此处找到示例连接字符串:http://docs.30c.org/conn/dbf-foxpro.html