Я использую драйвер VFPOLEDB для чтения файлов DBF, и я продолжаю получать эту ошибку, и я не уверен, почему и как решить проблему:
Поставщик не мог определить Десятичное значение. Например, строка была просто создана, значение по умолчанию для столбца Decimal не было доступно, и потребитель еще не установил новое Десятичное значение.
Вот код. Я называю эту стандартную программу, чтобы возвратить DataSet файла DBF и отобразить данные в 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;
}
}
Я наконец решил проблему, получив схему таблицы и затем преобразовав все несимвольные поля в varchar в инструкции select . Достаточно хорошо для предварительного просмотра содержимого таблицы.
Если вы добавляете строку из вашего 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".
Я нашел решение здесь: Ошибка чтения определенных числовых значений с помощью драйвера VFPOLEDB
SELECT CAST(FieldName As NUMERIC(11, 3)) From TableName