抛出错误消息
` qConsulta2 := TQuery.Create(Application);
qConsulta2.DatabaseName := 'BaseDato';
qConsulta2.SQL.Text := 'select VALOR from PARAMETRO where codigoPARAMETRO = ''IVA'' ';
qConsulta2.open;
qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:= qConsulta2.fieldbyname('valor').asfloat;
qConsulta2.close;
qConsulta2.free `
这让我执行了这个错误,不知道为什么,事先非常感谢你的时间和帮助。对不起我的英语不好。
答案 0 :(得分:2)
问题在于qConsulta2.fieldbyname('valor').asfloat
从我的测试中,如果VALOR列是数据库表中的text或varchar并且它包含Null或零长度字符串,则会发生错误。
我的测试涉及在MSAccess数据库中创建一个包含VALOR_TEXT和VALOR_FLOAT列的表。 VALOR_TEXT定义为文本,VALOR_FLOAT定义为double。我为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值转换为float,integer或string而不会出现异常。
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;
答案 1 :(得分:1)
确保qConsulta2.fieldbyname('valor')。asfloat不为空。
答案 2 :(得分:1)
您必须检查您的查询是否实际返回了记录:
qConsulta2 := TQuery.Create(Application);
try
qConsulta2.DatabaseName := 'BaseDato';
qConsulta2.SQL.Text := 'select VALOR from PARAMETRO where codigoPARAMETRO = ''IVA'' ';
qConsulta2.open;
if not qConsulta2.EOF then
qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:= qConsulta2.fieldbyname('valor').asfloat;
qConsulta2.close;
finally
qConsulta2.free
end;
或者如果要确保始终返回记录,请使用SQL COALESCE
命令:
qConsulta2 := TQuery.Create(Application);
try
qConsulta2.DatabaseName := 'BaseDato';
qConsulta2.SQL.Text := 'select COALESCE(VALOR, 0) AS valor from PARAMETRO where codigoPARAMETRO = ''IVA'' ';
qConsulta2.open;
qCompraDetalle.FieldByName('PORCENTAJE_IVA').AsFloat:= qConsulta2.fieldbyname('valor').asfloat;
qConsulta2.close;
finally
qConsulta2.free
end;
<强>更新强>
Wild猜这里,因为您没有提供数据库详细信息:如果VALOR
表中的PARAMETRO
字段实际上是Varchar类型,那么您可以使用空字符串而不是{{1} }:
NULL