您的问题在于qConsulta2.fieldbyname('valor').asfloat
根据我的测试,如果 VALOR 列是数据库表中的 text 或 varchar 并且它包含 Null 或零长度字符串,则会发生错误。
我的测试涉及在 MSAccess 数据库中创建一个包含 VALOR_TEXT 和 VALOR_FLOAT 列的表。 VALOR_TEXT 定义为文本,VALOR_FLOAT 定义为双精度。我为 4 个测试用例编写代码,2 个说明错误(Case1 和 Case2),2 个提供解决方案(Case 3 和 Case4)。下面提供了代码。
procedure TForm1.Case1;
var
f : double;
begin
db.ExecSQL('delete from PARAMETRO');
db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO) values(''IVT'')');
// VALOR_FLOAT and VALOR_TEXT are null
qConsulta2.SQL.Text := 'select * from PARAMETRO';
qConsulta2.Open();
f := qConsulta2.FieldByName('VALOR_FLOAT').AsFloat;
ShowMessage('From Float '+FloatToStr(f));
f := qConsulta2.FieldByName('VALOR_TEXT').AsFloat;
ShowMessage('From Text '+FloatToStr(f));
end;
procedure TForm1.Case2;
var
f : double;
begin
db.ExecSQL('delete from PARAMETRO');
db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO,VALOR_TEXT) values(''IVT'','''')');
// VALOR_FLOAT is null and VALOR_TEXT is '' (zero length string)
qConsulta2.SQL.Text := 'select * from PARAMETRO';
qConsulta2.Open();
f := qConsulta2.FieldByName('VALOR_FLOAT').AsFloat;
ShowMessage('From Float '+FloatToStr(f));
f := qConsulta2.FieldByName('VALOR_TEXT').AsFloat;
ShowMessage('From Text '+FloatToStr(f));
end;
Case3 直接适用于修复您的代码。通过获取 AsVariant 数据,NullStrictConvert := false 将允许将 Null 值转换为浮点、整数或字符串,而不会出现异常。
procedure TForm1.Case3;
var
f : double;
begin
NullStrictConvert := false;
db.ExecSQL('delete from PARAMETRO');
db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO) values(''IVT'')');
// VALOR_FLOAT and VALOR_TEXT are null
qConsulta2.SQL.Text := 'select * from PARAMETRO';
qConsulta2.Open();
f := qConsulta2.FieldByName('VALOR_FLOAT').AsFloat;
ShowMessage('From Float '+FloatToStr(f));
f := qConsulta2.FieldByName('VALOR_TEXT').AsVariant;
ShowMessage('From Text '+FloatToStr(f));
end;
Case4 提供了一种避免数据转换的方法,只要源列和目标列的类型相同。如果它们不是同一类型,仍然会出现数据转换错误。
procedure TForm1.Case4;
var
f : double;
begin
NullStrictConvert := false;
db.ExecSQL('delete from PARAMETRO');
db.ExecSQL('insert into PARAMETRO (codigoPARAMETRO) values(''IVT'')');
// VALOR_FLOAT and VALOR_TEXT are null
qConsulta2.SQL.Text := 'select * from PARAMETRO';
qConsulta2.Open();
f := qConsulta2['VALOR_FLOAT'];
ShowMessage('From Float '+FloatToStr(f));
f := qConsulta2['VALOR_TEXT'];
ShowMessage('From Text '+FloatToStr(f));
// avoid data conversion
qCompraDetalle.Open();
qCompraDetalle.Append;
qCompraDetalle['PORCENTAJE_IVA'] := qConsulta2['VALOR_TEXT'];
qCompraDetalle.Post;
end;