2010-08-23 2 views
1

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

Не удалось найти документацию о данном действии.

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

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

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

Edit: Этот вопрос в значительной степени был дан ответ здесь: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/af245580-8897-4608-8fa0-f00286d37324?prof=required

ответ

0

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

2

Похоже, что 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 

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

+0

Я не вижу, как это может быть основано на нулевом значении по сравнению с одной проблемой, помимо какой-то ошибки в реализации, которая использовала бы массив для некоторых манипуляций. Число, которое мы укажем, является размером, а не индексом. Это будет означать, что в какой-то момент это интерпретируется как индекс. –

1

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

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

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

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

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

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