我正在尝试编写简单的TDataset后代。在重写方法GetFieldData(Field:TField; var Buffer:TValueBuffer)中,我主要使用DataConvert函数填充缓冲区的实际值
case Field.FieldType of
ftCurrency:begin
C:=Some_Currency_Value;
if Buffer<>nil then
DataConvert(Field,@C,Buffer,True);
end;
但它不适用于BCD字段。我写的时候
ftBCD:begin
BC:=StrToBCD(Some_string_from_currency);
if Buffer<>nil then
DataConvert(Field,@BC,Buffer,True);
end;**
它显示奇怪的值。例如,对于值7,缓冲区填充值734.029
GetFieldData就像这样
X:=FData.ExtractRow(ix) as TMQueryData; //this is full record of my mem table
fix:=FData.FieldIndex(Field.FieldName);
case FData.FieldTypes[fix] of
ftFloat,ftCurrency:begin
C:=X.C[Field.FieldName];
if Buffer<>nil then
DataConvert(Field,@C,Buffer,True{False});
end;
result;=True;
ExtractRow说的是一个简单的数组。没什么复杂的。所以我把字段输入的字符串值作为货币,日期,日期时间,整数或其他,然后用DataConvert函数填充BUFFER。唯一的问题是ftBCD。到目前为止我通过转换bcd作为货币到临时TVaLueBuffer,然后使用DataConvert进行转换。看起来像这样
TDBBitConverter.UnsafeFrom<Currency>(Currency_Value, Temp_Buff);
DataConvert(Field,Temp_Buff,Buffer,True);