Delphi 7中TCustomADODataSet组件的一些错误,小结如下:
对应的单元文件是ADODB.pas。
一、nvarchar字段长度错误
在SQL Server数据库表中定义了nvarchar类型的字段,但程序中得到的TField对象的Size属性只有数据库中的一半。同时这还会导致一个不明症状:在程序中动态添加的Lookup字段若结果值类型为TWideString,则汉字串会被截断一部分并在末尾出现问号。
1、找到procedure TCustomADODataSet.InternalInitFieldDefs;
2、定位于这样一段:
case FieldType of
ftString, ftWideString, ftBytes, ftVarBytes, ftFixedChar:
FSize := F.DefinedSize;
3、 改成这样:
case FieldType of
ftString, ftBytes, ftVarBytes, ftFixedChar:
FSize := F.DefinedSize;
ftWideString:
FSize := F.DefinedSize * 2; // 对于宽字符,其字节长度为定义值的2倍
二、浮点数的小数部分丢失位数
TCustomADODataSet.EnableBCD默认为True,限制了小数位为4,这本是为了达到高精度,但是当数据库表中numeric字段定义的小数位超过4时,就不得不舍弃精度,得按实际小数位来做了:
1、找到procedure TCustomADODataSet.InternalInitFieldDefs;
2、定位于其中的过程 procedure AddFieldDef(F: Field; FieldDefs: TFieldDefs);
3、找到第一条语句:FieldType := ADOTypeToFieldType(F.Type_, EnableBCD);
4、改成这样:
// Added by iMe
if F.NumericScale >4 then
FieldType := ADOTypeToFieldType(F.Type_, False)
else
// -------------
FieldType := ADOTypeToFieldType(F.Type_, EnableBCD); // 这行是原来的