Ширина числового поля в файле DBF несовместима при создании с помощью oleDB (.NET) - PullRequest
1 голос
/ 24 августа 2010

OleDB всегда добавляет еще одну цифру в числовые поля DBF при их создании.Команда, подобная этой: CREATE TABLE [file1.DBF] ( [MY_FIELD] NUMERIC(1,0) NULL) создаст поле, которое может содержать 2 цифры (или одну цифру и знак минус).Забавно, что я могу запросить длину ноль, такую ​​как NUMERIC(0,0), и она собирается создать поле длиной 1.

Я не смог найти никакой документации относительно этого поведения.

Это специфично для использования oleDB для создания DBF или то же самое может случиться с другими БД?

Добавлена ​​ли дополнительная цифра oleDB только для обработки знака минус?

Соответствует ли это поведение?Я имею в виду, могу ли я просто вычесть один из ширины при создании таблицы?

Редактировать: На этот вопрос довольно много ответов здесь: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/af245580-8897-4608-8fa0-f00286d37324?prof=required

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Похоже, что DRapp может что-то включить.

CREATE TABLE [file1.DBF] ( [MY_FIELD] NUMERIC(1,0) NULL)

из FoxPro создает:

Structure for table:    FILE1.DBF
Number of data records: 0       
Date of last update:    08/24/10
Code Page:              1252    
Field  Field Name      Type                Width    Dec   Index   Collate Nulls
    1  MY_FIELD        Numeric                 1                            Yes
** Total **                                    3

Тот же SQL через OleDb создает:

Structure for table:    FILE1.DBF
Number of data records: 0       
Date of last update:    08/24/10
Code Page:              1252    
Field  Field Name      Type                Width    Dec   Index   Collate Nulls
    1  MY_FIELD        Numeric                 2                            Yes
** Total **                                    4

Но, CREATE TABLE [file1.DBF] ( [MY_FIELD] NUMERIC(0,0) NULL) через OleDb создает:

Structure for table:    FILE1.DBF
Number of data records: 0       
Date of last update:    08/24/10
Code Page:              1252    
Field  Field Name      Type                Width    Dec   Index   Collate Nulls
    1  MY_FIELD        Numeric                 1                            Yes
** Total **                                    3

Та же структура, что и в FoxPro.По какой бы причине это не происходило, это указывает на то, что между движком FoxPro и драйвером VFPOLEDB существует различие.

1 голос
/ 01 июля 2011

Это больше, чем отсчет с нуля.Если вы выполните следующие действия через OLEDB:

ALTER TABLE MyTable ADD COLUMN n_value N(5, 4) 

Вы получите поле размером 7, а не 6. Кроме того, N(6, 4) дает N(8, 4).

КБ# 150434 описывает то же самое поведение для драйвера ODBC.Однако даже в этой статье нет точного описания сценария, описанного выше, с 4 десятичными знаками.Мои тесты показывают, что уравнение для размера (из кода C #):

if (places <= 1)
{
    size -= 1;
}
else
{
    size -= 2;
}

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

0 голосов
/ 24 августа 2010

Это может быть так же просто, как интерпретация на основе нуля по сравнению с одноосновной, но интересная находка.

...