我正在使用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;
}
}
答案 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