''是无效的浮点值delphi

时间:2013-11-22 14:12:53

标签: delphi floating-point

抛出错误消息

enter image description here

` 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 `

这让我执行了这个错误,不知道为什么,事先非常感谢你的时间和帮助。对不起我的英语不好。

3 个答案:

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