关于ado中使用update的疑问!(50分)

  • 主题发起人 主题发起人 fwq
  • 开始时间 开始时间
F

fwq

Unregistered / Unconfirmed
GUEST, unregistred user!
我在使用ado进行更新表的操作中出现如下提示:操作必须使用一个可更新的查询!
我的程序如下:
for i:=0 to 3 do
begin
q.Close;
q.SQL.Clear;
q.SQL.add('insert into tj (fdate,fno) values(:adate,:ano)');
q.Parameters.ParamByName('adate').DataType :=ftdate;
q.Parameters.ParamByName('adate').Value :=encodedate(2002,i+1,1);
q.Parameters.ParamByName('ano').DataType :=ftinteger;
q.Parameters.ParamByName('ano').Value :=i;
q.Prepared :=true;
q.ExecSQL;
q.Close;
q.SQL.Clear;
q.SQL.add('update tj set fmoney=(select sum(ls.fmoney) from ls where ls.fdate>:afdate and ls.fdate<:atdate) where tj.fno=:ano');
q.Parameters.ParamByName('afdate').DataType :=ftdate;
q.Parameters.ParamByName('afdate').Value :=dtp_from.Date;
q.Parameters.ParamByName('atdate').DataType :=ftdate;
q.Parameters.ParamByName('atdate').Value :=dtp_to.Date;
q.Parameters.ParamByName('ano').DataType :=ftinteger;
q.Parameters.ParamByName('ano').Value :=i;
q.Prepared :=true;
q.ExecSQL;
end;
 
问题可能出在那个update中,换成AdoCommand来执行sql语句试试!
 
你在Explore中单独的执行一下这条语句,看看能不能执行或报什么错误~
update tj set fmoney=(select sum(ls.fmoney) from ls where ls.fdate>date and ls.fdate<tdate) where tj.fno=ano
 
使用了只读的adoconnection?
 
程序中的上半部分执行成功,而且adoquery的属性也没有设置只读,同时有关update的那句
在explorer中执行成功,请大侠们指点。
 
最后是Prepared错,还是执行时错?
 
to :lvxq
程序编译通过,但执行时发生上述错误,程序执行到第二个q.execsql;语句。
 
在第二个sql执行时加上q.Parameters.clear;
q.Parameters.ParamByName('afdate').DataType :=ftdate;
q.Parameters.ParamByName('afdate').Value :=dtp_from.Date;
q.Parameters.ParamByName('atdate').DataType :=ftdate;
 
to:tangdongping
当使用q.parameters.clear;后执行程序,报告说:q的parameters中的第一个参数afdate
找不到。
当把q.parameters.clear;放在q.sql.clear;后执行时,问题依旧。请指点。
 
不要用q.parameters.clear,
改用q.Parameters.Refresh;
一清除沒參數怎么執行,因為二次
的參數不一樣,刷新一下。
 
你可以试一试再加一个ADOQuery控件,即:q1,程序的下半部分使用q1来执行,我也碰过
和你一样的问题,如果还不行,有可能是你的程序除了问题.
 
to zxb200:
使用q.parameters.clear;和q.parameters.refresh;效果一样,错误依旧。
to userman :
使用不同的adoquery和换一个adocommand执行效果一样,错误依旧。

to all:
各位高手请你们指点迷津,在下已经绞尽脑汁、苦思冥想了几天,痛苦!痛苦!
 
你在用AdoCommand时试验时也应该跟你的程序一样作所有的事情,比如在你帖出的部分
里有两个操作,Insert和Update,(当然我不知道你在这之前作了什么?)因此,关试验
后一个操作正确并不能说明什么,我觉得你应该跟作程序一样的事情。因为存在这种情况
,你的insert操作成功后,对于第二个Update可能会存在Key的锁定。不知道这样说的意思
明白了吗

 
不知道有那位高人愿意告知email,小弟将原码发来请代为测试!
感恩不尽!
 
hbezwwl@163.com.晚上帮你测试。
 
发源马,不还要环境吗??太麻烦了。
可能原因是这样,你在程序中使用了Query的嵌套,我不知道这样是否在Delphi中能用。
不过换了我我会再使用其它办法,比如你的后半段:
q1.sql.clear;
q1.sql.add("select sum(ls.fmoney) from ls where ls.fdate>:afdate and ls.fdate<:atdate")
q.Parameters.ParamByName('afdate').DataType :=ftdate;
q.Parameters.ParamByName('afdate').Value :=dtp_from.Date;
q.Parameters.ParamByName('atdate').DataType :=ftdate;
q.Parameters.ParamByName('atdate').Value :=dtp_to.Date;

q1.open;
然后把返回值赋给下面的,
q.SQL.add('update tj set fmoney=(这里是刚才的返回值) where tj.fno=:ano');
q.Parameters.ParamByName('ano').DataType :=ftinteger;
q.Parameters.ParamByName('ano').Value :=i;
q.Prepared :=true;
q.ExecSQL;
ISNULL(,....)
所以,请你再这样试验一下,


q.SQL.add('update tj set fmoney=(ISnULL(select sum(ls.fmoney) from ls where ls.fdate>:afdate and ls.fdate<:atdate),'0') where tj.fno=:ano');

好了,我所有的办法只能这样了
因为不排除你在里面的SELECT语句会返回NULL值的可能,所以最好的话还要先赋
默认值,比如
 
哈哈,显示乱了,上面的秩序应该是这样
。。。。。。。。。

q.ExecSQL;
因为不排除你在里面的SELECT语句会返回NULL值的可能,所以最好的话还要先赋
默认值,比如
ISNULL(,....)
所以,请你再这样试验一下,


q.SQL.add('update tj set fmoney=(ISnULL(select sum(ls.fmoney) from ls where ls.fdate>:afdate and ls.fdate<:atdate),'0') where tj.fno=:ano');
 
jiangpengjun@21cn.com 我也试试。
 
[8D]谢谢大家的热心解答,但是所有的解答都没有能够解决问题的真正原因,小生最后还是换用
了另外的方法解决的,分数不多我也不知道给那位,还是平分了吧!
 
后退
顶部