update问题 ( 积分: 50 )

  • 主题发起人 主题发起人 lucky.gong
  • 开始时间 开始时间
L

lucky.gong

Unregistered / Unconfirmed
GUEST, unregistred user!
现在没有全文检查功能,感觉不方便.&nbsp;很久没提问了,今天碰到一个怪问题,还没想通,上来请教各位高手.<br>我在面板上,放了两个edit,&nbsp;一个为单价,一个为数量.&nbsp;在数据库中对应定两字段为float型.&nbsp;因为有可能为空值,所以在用insert写入数据库时可以先判断再写入.&nbsp;然后我将这条记录取出,同样是空值,我用update语然句进行先判断后更新,提示出错,说空值不能转换为float.&nbsp;难道用update语句不可以用null写入为float&nbsp;的字段中吗?
 
理论上是可以的,要看看语句才知道
 
可以,你把语句贴出来看看
 
你可以将0.0插入数据库啊,对于数量应该用整型,浮点数毕竟存在精度问题
 
如果是&nbsp;''&nbsp;写入数据库就不行,除非你显示的将&nbsp;sql语句中&nbsp;写&nbsp;null<br><br>sql.clear;<br>sql.add('update&nbsp;atable&nbsp;set&nbsp;price=null')<br><br>如果是<br>q.sql.clear;<br>q.sql.add('update&nbsp;atable&nbsp;set&nbsp;price=:p');<br>q.paramentbyname('p').value&nbsp;:=&nbsp;edit_price.text;&nbsp;//这里如果&nbsp;text&nbsp;=&nbsp;''&nbsp;就出错<br>''&nbsp;不是&nbsp;null
 
你可以赋一个初始值呀&nbsp;不录入时为&nbsp;0&nbsp;&nbsp;我是这样做了
 
设置一下float的精度
 
你的先判断后更新是判断的什么?是不是单价过数量是否为空?<br>从你错误提示来看是update&nbsp;表&nbsp;set&nbsp;字段=''&nbsp;了&nbsp;也就是说你的单价或数量为空因该判断下<br>还有最好数据库设计如下&nbsp;单价&nbsp;为&nbsp;numeric&nbsp;设置好精度和小数为数&nbsp;默认值为(0.0)<br>&nbsp;数量&nbsp;int&nbsp;默认值为&nbsp;0&nbsp;合理~
 
with&nbsp;DM.WBAGYSADO&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql.Clear;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql.Add('update&nbsp;OUTERBAG&nbsp;set&nbsp;price=:a');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;strtofloat(price.Text)&gt;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parameters.ParamByName('a').Value&nbsp;:=strtofloat&nbsp;(price.Text)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Parameters.ParamByName('a').Value:=Null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Prepared:=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecSQL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>当price中为空值时,就会报错.
 
咋没朋友再帮一下呢
 
错在这里&nbsp;strtofloat(price.Text)<br>用try&nbsp;捕捉一下<br>try&nbsp;x:=strtofloat(price.Text);&nbsp;except&nbsp;x:=0;&nbsp;end;<br>if&nbsp;x&gt;0&nbsp;then
 
to&nbsp;skado<br>谢谢,试过了你的方法,还是报一样的错
 
with&nbsp;DM.WBAGYSADO&nbsp;do<br>&nbsp;begin<br>&nbsp;&nbsp;close;<br>&nbsp;&nbsp;sql.Clear;<br>&nbsp;&nbsp;if&nbsp;strtofloat(price.Text)&gt;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;sql.Add('update&nbsp;OUTERBAG&nbsp;set&nbsp;price='+strtofloat&nbsp;(price.Text));<br>&nbsp;&nbsp;else&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;sql.Add('update&nbsp;OUTERBAG&nbsp;set&nbsp;price=NULL');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;ExecSQL;<br>end;
 
如果是ADO的话,参数默认是不接受NULL的,要将属性改一下<br>&nbsp;&nbsp;with&nbsp;ADOQuery1.Parameters.ParamByName('FieldName')&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;Attributes&nbsp;:=&nbsp;Attributes&nbsp;+&nbsp;&nbsp;&nbsp;[paNullable];
 
首先你用的是edit而不是dbedit&nbsp;&nbsp;这样你取出来的浮点性数据&nbsp;如果是null的&nbsp;&nbsp;edit会自动转换成edit.text&nbsp;:=&nbsp;''&nbsp;<br>1.你可以这样&nbsp;如果你是哪个query给edit赋的值&nbsp;就&nbsp;直接去&nbsp;那个query的&nbsp;fieldbyname('').value&nbsp;&nbsp;value会把null赋进去&nbsp;&nbsp;如果是fieldbyname('').asinteger的话会报错&nbsp;&nbsp;<br>2.如果是null就传&nbsp;0&nbsp;的话&nbsp;&nbsp;就可以&nbsp;&nbsp;strtofloatdef(price.Text,0);总之感觉是小问题&nbsp;别死专牛角尖了
 
可以判断一下嘛.只要EDIT中为空时.你就写入NULL.否则写入你输入的值就是了.
 
借在这里:<br>if&nbsp;strtofloat(price.Text)&gt;0&nbsp;then
 
var<br>DoubleValue:double;<br>.....<br>.....<br>with&nbsp;DM.WBAGYSADO&nbsp;do<br>&nbsp;begin<br>&nbsp;&nbsp;close;<br>&nbsp;&nbsp;sql.Clear;<br>&nbsp;&nbsp;if&nbsp;&nbsp;trystrtofloat(Trim(price.Text),DoubleValue)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;sql.Add('update&nbsp;OUTERBAG&nbsp;set&nbsp;price='+Trim(price.Text));<br>&nbsp;&nbsp;else&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;sql.Add('update&nbsp;OUTERBAG&nbsp;set&nbsp;price=NULL');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;ExecSQL;<br>end;
 
这两天忙,没时间上来看,非常感谢这么多朋友热心帮助.<br>to&nbsp;kaida&nbsp;你的方法和我的差不多,也是会报一样的错的.<br>to&nbsp;levi&nbsp;能否给个例子明示,谢谢!<br>to&nbsp;newzhq,&nbsp;SFG,非常感谢两位,你们的方法我试过了,确实都可以,将两方法融合也是可以.真的谢谢!
 
var&nbsp;tpVal:Variant;<br>q.sql.add('update&nbsp;atable&nbsp;set&nbsp;price=:p');<br>q.paramentbyname('p').value&nbsp;:=&nbsp;edit_price.text;<br>with&nbsp;q.Parameters.ParamByName('p')&nbsp;do&nbsp;<br>&nbsp;&nbsp;Attributes&nbsp;:=&nbsp;Attributes&nbsp;+&nbsp;&nbsp;&nbsp;[paNullable];&nbsp;&nbsp;//不加上这句,给参数赋空值就会报你提的那个错误<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;tpVal:=&nbsp;strtofloat(price.Text);<br>&nbsp;&nbsp;Except<br>&nbsp;&nbsp;&nbsp;tpVal&nbsp;:=&nbsp;Null;<br>&nbsp;&nbsp;&nbsp;q.Parameters.ParamByName('a').Value:=tpVal;<br><br>差不多这样,就完全可以了
 
后退
顶部