使用oleDB(.NET)创建DBF文件中的数字字段宽度不一致

时间:2010-08-23 21:38:50

标签: .net oledb foxpro dbf

OleDB在创建DBF数字字段时总是再添加一个数字。像这样的命令: CREATE TABLE [file1.DBF] ( [MY_FIELD] NUMERIC(1,0) NULL) 将创建一个可包含2位数(或一位数和一个减号)的字段。有趣的是,我可以像NUMERIC(0,0)一样要求零长度,并且它将创建一个长度为1的字段。

我找不到有关此行为的任何文档。

是否特定于使用oleDB创建DBF或者其他DB可能会发生同样的情况?

oleDB添加的额外数字仅用于处理减号吗?

这种行为是否一致?我的意思是,当我创建表格时,我可以减去一个宽度吗?

编辑: 这个问题在这里得到了很好的回答: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/af245580-8897-4608-8fa0-f00286d37324?prof=required

3 个答案:

答案 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

与FoxPro相同的结构。无论出于何种原因,它都会指出FoxPro引擎和VFPOLEDB驱动程序之间的行为存在差异。

答案 1 :(得分: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;
}

我能够使用各种数字列长度更新数百个不同的列,并且所有列都按预期更新。

答案 2 :(得分:0)

它可能就像从零开始的解释而不是基于一个但有趣的发现一样简单。