你的問題是與qConsulta2.fieldbyname('valor').asfloat
從我的測試你的錯誤,如果VALOR列是文本或varchar將出現在數據庫表中,它包含一個空或零長度的字符串。
我的測試涉及在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
將允許將空值轉換爲浮點數,整數或字符串,但不會出現異常。
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;
2013年還在使用BDE嗎?哇... –