Чтение DBF с драйвером VFPOLEDB - PullRequest
6 голосов
/ 17 февраля 2010

Я использую драйвер VFPOLEDB для чтения файлов DBF, и я продолжаю получать эту ошибку, и я не уверен, почему и как решить проблему:

Поставщик не может определить десятичное значение. Например, строка была только что создана, значение по умолчанию для столбца «Десятичное число» недоступно, а потребитель еще не установил новое значение «Десятичное число».

Вот код. Я вызываю эту процедуру, чтобы вернуть 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;
    }
}

Ответы [ 4 ]

7 голосов
/ 28 мая 2010

Я нашел решение здесь: Ошибка чтения определенных числовых значений с драйвером VFPOLEDB

SELECT CAST(FieldName As NUMERIC(11, 3)) From TableName
0 голосов
/ 29 января 2015

Это известная проблема. Особенно, если вам нужно выделить все столбцы, это гораздо удобнее:

Select * from some_table

Одним из рабочих решений является использование другого поставщика, например Microsoft.Jet.OLEDB.4.0. Пример строки подключения можно найти здесь: http://docs.30c.org/conn/dbf-foxpro.html

0 голосов
/ 14 марта 2010

Я наконец-то решил проблему, получив схему таблицы и затем приведя все несимвольные поля к varchar в операторе select. Достаточно хорош для предварительного просмотра содержимого таблицы.

0 голосов
/ 17 февраля 2010

Если вы добавляете строку из своего вида сетки, она не обязательно использует значение по умолчанию, а скорее NULL, поэтому вам может потребоваться предварительно установить значения по умолчанию или установить в схеме NOT Allow Null.

Можно выполнить автоматизацию по столбцам после выполнения запроса и принудительно установить значения по умолчанию на основе типов данных столбцов, например

.
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 типа по умолчанию, но могут быть и другие, такие как логические, десятичные, с плавающей точкой, что угодно, просто добавьте в if / else и поместите любые значения по умолчанию. Это МОЖЕТ помочь, если в противном случае при добавлении новых строк вводятся значения NULL.

...