ADO的AsFloat返回的值有什么问题?

heinsect 2003-10-20 11:40:57
在表中定义两个字段为:
TEngMon_Absence float DEFAULT 1 NOT NULL ,
TEngMon_NormalOT float DEFAULT 1 NOT NULL ,

在SQL2K中查表看到是1.0

Delphi中代码:
m_dfAbsenceDay := ADOQuery1.FieldByName('TEngMon_Absence').AsFloat;
m_dfNormalOT:= ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsFloat;

edAbsence.Text := FormatFloat('0.00', m_dfAbsenceDay);
edNormalOT.Text := FormatFloat('0.00', m_dfNormalOT);

edAbsence.Text赋值时没问题,edNormalOT.Text赋值时出EConvertError异常:
''' is not a valid floating point value'

我自己重写过FormatFloat,用Format,临时变量值正确,交给result就出错。
?????????
...全文
214 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
heinsect 2003-10-21
  • 打赏
  • 举报
回复
我改成了下面的样子,编译时关了优化,加上所有的调试。单步走,同样的异常:

ShowMessage(ADOQuery1.FieldByName('TEngMon_Absence' ).AsString);//显示结果为1
strTemp := ADOQuery1.FieldByName('TEngMon_Absence').AsString;
edAbsence.Text := strTemp;
m_dfAbsenceDay := StrToFloat(strTemp);

ShowMessage(ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsString)//显示结果为1;
strTemp := ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsString;
edNormalOT.Text := strTemp; <------------这一行报错
m_dfNormalOT := StrToFloat(strTemp);

我试的时候表中的定义用decimal(4,1)/numeric(4,1)/float都用过。都是同样的错。
fhuibo 2003-10-21
  • 打赏
  • 举报
回复
没有问题的
angle097113 2003-10-21
  • 打赏
  • 举报
回复
这样实现就可以了
edAbsence.Text := ADOQuery1.FieldByName('TEngMon_Absence').AsString;
edNormalOT.Text := ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsString;
没有问题的!


pingo888 2003-10-21
  • 打赏
  • 举报
回复
edAbsence.Text := ADOQuery1.FieldByName('TEngMon_Absence').AsString;
edNormalOT.Text := ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsString;
heinsect 2003-10-21
  • 打赏
  • 举报
回复
多谢zhyanger,就是OnChange与前面的代码捣乱。
edNormalOnChange:
m_dfNormalOT := StrToFloat(edNormalOT.Text);

我在所有控件的Text中加了一个初值,解决了。

这么说Delphi中的OnChange是在另一个线程中处理的,没想到这一点。
所以我跟踪时到不了这里。

多谢各位,再加100分。前面的100给zhyanger,另100大家分吧。
zhyanger 2003-10-21
  • 打赏
  • 举报
回复
你在edNormalOT.onchange内有事件吗(或者ADOQuery1有计算字段)?设断点跟踪一下,
dowsun 2003-10-21
  • 打赏
  • 举报
回复
如果看上去没有问题,可以用强制转换:
var
TpmStr : String;
TmpFloat : Float;
...

TmpStr := ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsString;
TmpFloat := StrToFloat(TmpStr);
dowsun 2003-10-21
  • 打赏
  • 举报
回复
先让系统返回字符串,然后把它show一下,应该可以看出问题所在。

ShowMessage(ADOQuery1.FieldByName('TEngMon_NormalOT' ).AsString);
angle097113 2003-10-21
  • 打赏
  • 举报
回复
后来的提示什么错误呢?
我的代码:
Var
strTemp:String;
m_dfAbsenceDay:Double;
m_dfNormalOT:Double;
begin
ShowMessage(ADOQuery1.FieldByName('aa' ).AsString);
strTemp := ADOQuery1.FieldByName('aa').AsString;
Edit1.Text := strTemp;
m_dfAbsenceDay := StrToFloat(strTemp);
ShowMessage(ADOQuery1.FieldByName('f2' ).AsString);
strTemp := ADOQuery1.FieldByName('f2' ).AsString;
edit2.Text := strTemp;
m_dfNormalOT := StrToFloat(strTemp);
end;
aa,f2都是float字段类型的数据 我的没有问题的呀!再看看吧 希望我写的对于你有价值!
heinsect 2003-10-20
  • 打赏
  • 举报
回复
我自己顶

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧