华佗们,帮我把把脉吧!!!(100分)

  • 主题发起人 主题发起人 kanny_chen
  • 开始时间 开始时间
K

kanny_chen

Unregistered / Unconfirmed
GUEST, unregistred user!
我想SQL修改符合我给出的几个值的数据但没有成功,请看代码:
rz_write.Close;
rz_write.SQL.Clear;
rz_write.SQL.add('update a0401 set a040103=:state where a040101 in(:aa)');
rz_write.Parameters.ParamByName('aa').value:=test;
rz_write.Parameters.ParamByName('state').value:=roomstate;
rz_write.ExecSQL;

注:TEST为一个字符串,我用的是D5+SQL7
我的TEST字串的值为一个如='102'程序正常,但如果='102,103,104'程序没有按我的意思
完成
 
想看看参数替换后的SQL样子吗? 你就知道为什么不成功了
update a0401 set a040103=1 where a040101 in('102,103,104')
 
可是如果字串的值只有一个的话如:('102') 为何可以成功?
 
是Params的Value在作怪, 因为它是Variant的, 在填值时会进行转换, 所以你以为给的
是个字符串, 它填入时将自动转成整型
 
另: 根据SQL标准, Parameter传的是单值, 不是集合, 所以你这样使用是错的, 要实现
你想要的功能, 不能用 params参数来实现, 而应当用Delphi字符串操作的方法来动态
生成整句sql语句:
rz_Write.SQL.Text := 'update a0401 set a040103=:state where a040101 in(' + roomstate + ')'; // roomstate是个字符串, 也就是你的102, 103, 104
 
本来想说!但看了EYES的后就不用说了!
 
=>Another_eYes
动态写我也想过,但集合的值的来源是LISTBOX,而LISTBOX的ITEMS是不定的
必须循环才能将ITEMS取出
我不知在SQL中如何运用,可否帮我想一下办法.
我想UP的数据是A040103字段的值,:STATE的值我会另赋的
请再继续....
 
kanny_chen的传值方法也是可以的。
只不过需要用程序的方法为aa中每一个项都加上引号
如:
aa:='''102'',''103'',''104'''
 
<marquee>hi</marquee>
 
=>刘素杰:
按你的办法我试过了,不行,请再出高招!!

=>ANOTHER_EYES:
我用来判断的字段A040101的类型是也整型(INTEGER)应该相容的!!
 
嘿嘿,检个便宜
roomstate := '';
for i:=0 to ListBox.Items.Coun-1 do
begin
if roomstate<>'' then roomstate := roomstate + ',';
roomstate := roomstate + ListBox.Items;
end;

rz_Write.SQL.Text :=...+ roomstate +...
 
=>龙丹:
你没有理解我的意思,请看细一点,取ITEMS的值不是我的问题的关键
不清楚的我再补,谢谢灌水!!
 
kanny_chen:
你好象没有看最后一句,那是Another_eYes给你的答案,前后一串就已经完事了。
如果你非要直接在SQL里使用ListBox不可,请便。
当我没来过。


一嘶长鸣,狂风卷过,一袭黑依消失在无边的黑暗之中,...... 死一般的寂静.....
 
rz_write.Parameters.ParamByName('aa').value:=test
该为rz_write.Parameters.ParamByName('aa').AsString:= test;

 
龙丹和eyes 的方法完全可以解决问题!
 
g:龙丹and ..eyes
 
再补充下下我的问题:
我想UP的记录条件来源为LISTBOX的ITEMS
简化一下我的语句:
for i:=0 to ListBox.Items.Coun-1 do
begin
if roomstate<>'' then TEST := TEST + ',';
TEST := TEST + ListBox.Items;
end;
// 求得LISTBOX.ITEMS到TEST后,值为('102,103,104')

rz_write.SQL.add('update a0401 set a040103=99 where a040101 in (:aa)');
rz_write.Parameters.ParamByName('aa').value:=TEST;

如果TEST的值只有一个程序OK,但为几个值,SQL语句就一个条件都不满足了.
TEST为我定的一个STRING变量
 
用刘素杰 的方法

rz_write.Parameters.ParamByName('aa').value:=TEST;
改为
rz_write.Parameters.ParamByName('aa').asstring=TEST;
试试看


 
多人接受答案了。
 
后退
顶部