6

我正在使用 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

4 回答 4

7

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

SELECT CAST(FieldName As NUMERIC(11, 3)) From TableName
于 2010-05-27T20:37:06.293 回答
0

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

Select * from some_table

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

于 2015-01-29T20:30:39.083 回答
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”值。

于 2010-02-17T14:16:18.237 回答
0

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

于 2010-03-14T08:02:50.290 回答