ADO是不是在SQL语句内同一个变量不能用多次啊,也就是:
   q1.close;
   q1.SQL.clear;
   q1.SQL.Add('update tb1 set a=:a,b=:a');
   q1.parameters.parambyname('a').value=val1;
   execsql;
好像这句一执行就出错,在select 中用同一个变量多次又没有问题

解决方案 »

  1.   

    这样是不行, Tparameters不允许有重复值
      

  2.   

    q1.close;
       q1.SQL.clear;
       q1.SQL.Add('update tb1 set a=:a,b=:b');
       q1.parameters.parambyname('a').value=val1;
       q1.parameters.parambyname('b').value=val2;
       execsql;
      

  3.   

    楼主你又何必要使用同一个变量呢?
     这样使你的程序的可阅读性变得很差,用不同的变量名也很方便哈像这样多好的:   q1.Close;
       q1.SQL.Clear;
       q1.SQL.Add('update tb1 set a=:a,b=:b');
       q1.Prameters.ParamByname('a').value=val1;
       q1.Parameters.ParamByname('b').value=val2;
       EXECSQL;
      

  4.   

    q1.Close;
       q1.SQL.Clear;
       q1.SQL.Add('DECLARE @IA INT SET @IA = :a update tb1 set a=@IA,b=@IA');
       q1.Prameters.ParamByname('a').value=val1;
       EXECSQL;
    在MS SQL SERVER2000可以这样用
      

  5.   

    这样是不行, Tparameters不允许有重复值
      

  6.   

    q1.Close;
       q1.SQL.Clear;
       q1.SQL.Add('update tb1 set a=:a,b=:b');
       q1.Prameters.ParamByname('a').value=val1;
       q1.Parameters.ParamByname('b').value=val2;
       EXECSQL;
    --------------------------------------------------------------
    不好意思,谁能告诉我,我搞不明白为什么要用这两句呢;
       q1.Prameters.ParamByname('a').value=val1;
       q1.Parameters.ParamByname('b').value=val2;这样有什么好处呢,什么时候用这个好;
    -------------------------------------------------------------------------------
    直接这样也行啊
       q1.Close;
       q1.SQL.Clear;
       q1.SQL.Add('update tb1 set a='''+变量a+''',b='''+变量b+'''');
    ---------------------------------------------------------------
      

  7.   

    因为SQL语句在数据库管理系统中可以判断是否有相同解释连接优化编译好的SQL语句,如有就不用重新解释连接优化编译,减少数据库服务器的压力,如不用参数,SQL语句相同的可能性就很小,一般都要重解释连接优化编译。
    对MS SQL SERVER2000
       q1.Close;
       q1.SQL.Clear;
       q1.SQL.Add('DECLARE @IA INT SET @IA = :a; update tb1 set a=@IA,b=@IA;');
       q1.Prameters.ParamByname('a').value=val1;
       q1.EXECSQL;是可行的,你可以试试
      

  8.   

    q1.close;
       q1.SQL.clear;
       q1.SQL.Add('update tb1 set a=:a,b=:b');
       q1.parameters.parambyname('a').value=val1;
       q1.parameters.parambyname('b').value=val2;   execsql;
      

  9.   

    q1.close;
       q1.SQL.clear;
       q1.SQL.text:=format('update tb1 set a=%s,b=%0:s',[val1]);
       execsql;
      

  10.   

    主要是没有那么简单,比如要执行下面这个语句,如果分开写的话将会是一大堆代码
    if exists(select * from tb1 where id=:id)
     update tb1 set a1=:a1,a2=:a2,a3=:a3,a4=:a4,a5=:a5 where id=:id
    else
      insert into tb1(a1,a2,a3,a4,a5) values(:a1,:a2,:a3,:a4,:a5)如果用BDE的QUERY的话是没有任何问题的,用ADO就显得很麻烦
      

  11.   

    如果用 chenchangfu(小虾) 的办法的话也要在SQL语句中先定义很多变量,如果要操作的字段有很多二十个就要在SQL语句中定义20个变量,不知道有没有其他更好的办法
      

  12.   

    有没有更好的办法啊,难道只有改用BDE了吗
      

  13.   

    我喜欢这样的形式:
    var
    tempstr:String;tempstr:='update tb1 set a='''+变量a+''',b='''+变量b+''''
    q1.Close;
    q1.SQL.Text:=tempstr;
    q1.Execsql
      

  14.   

    我觉得用参数形式,能解决delphi对一些特殊字符的更新,这点可取.
    而且''''多了,有点错.学习..
      

  15.   

    不好意思,谁能告诉我,我搞不明白为什么要用这两句呢;
       q1.Prameters.ParamByname('a').value=val1;
       q1.Parameters.ParamByname('b').value=val2;这样有什么好处呢,什么时候用这个好;
    这是参数,如果你用了Prameters,当然就有了参数,就要给参数赋值了
    当然可以用变量,不过那样维护不太方便