从BDE移植到ADO。本来完全没问题的语句现在出问题了。例如以下代码,目的是根据条件判断,如果表中没有就插入数据:
with AdoCommand do
Begin
  Connection:=AdoConnection;
  CommandType:=cmdText;
  CommandText:=
      'IF NOT EXISTS (SELECT 1 FROM table1 '+
                    ' WHERE Field1=:Field1 AND Field2=:Field2 ' +
                    ' AND Field3=:Field3 AND Field4=:Field4) ' +
      'BEGIN' +
      '  INSERT table1 '+
      '  (Field1,Field2,Field3,Field4,Field5) '+
      '  VALUES(:Field1,:Field2,:Field3,:Field4,:Field5) ' +
      'END';
  Parameters.ParamByName('Field1').Value:=Value1;
  Parameters.ParamByName('Field2').Value:=Value2;
  Parameters.ParamByName('Field3').Value:=Value3;
  Parameters.ParamByName('Field4').Value:=Value4;
  Parameters.ParamByName('Field5').Value:=Value5;
  Execute;         //这句出错
end;出错信息:Parameter object is improperly defined. Inconsistent or incomplete information was provided用TQuery赋上相应的SQL语句时是完全没问题的,而转用ADOCommand就出现异常了(转用ADOQuery结果一样)。请问高手,这问题该如何解决?什么原因造成的?注:以上SQL语句,把IF EXISTS条件去掉的话异常就没有了。

解决方案 »

  1.   

    实际上你是执行了两条sql语句
    你不用参数只接写肯定没问题
      

  2.   

    我的意见是,因为BDE并不是一个标准的数据库引..,而ADO是,所有你原来有BDE的程序可能并不能完全不加修改的变成ADO的程序上来,根据错误提示,原因可能是出在参数,具体我也不知道怎么修改!
    try:
    先定义参数,然后再给值,一切按书上的来做,可能问题能很快解决!祝你好运!
      

  3.   

    但用TQuery是没问题的啊。
    那有什么办法可以作最小的改动而让程序正实工作呢?
      

  4.   

    delphi我好久没用了,忘记了.看看这样行不行?动态构造sql语句.这样应该没有问题的.CommandText:=
          'IF NOT EXISTS (SELECT 1 FROM table1 '+
                        ' WHERE Field1='+Value1.tostring+' AND Field2='+ Value2.tostring+'.........'
      

  5.   


          'IF NOT EXISTS (SELECT 1 FROM table1 '+
                        ' WHERE Field1=:Field1 AND Field2=:Field2 ' +
                        ' AND Field3=:Field3 AND Field4=:Field4) ' +
          'BEGIN' +
          '  INSERT table1 '
         + '  (Field1,Field2,Field3,Field4,Field5) '
         +'  VALUES('+''''+Field1+''''+','+''''+Field2+''''+','+''''+Field3+''''+','
                    +''''+Field4+''''+','+''''+Field5+''''+') '
           +'END';
    试一下
    其中Field1...是字符型变量!
      

  6.   

    CommandText:=
          'IF NOT EXISTS (SELECT 1 FROM table1 '+
                        ' WHERE Field1=@Field1 AND Field2=@Field2 ' +
                        ' AND Field3=@Field3 AND Field4=@Field4) ' +
          'BEGIN' +
          '  INSERT table1 '+
          '  (Field1,Field2,Field3,Field4,Field5) '+
          '  VALUES(@Field1,@Field2,@Field3,@Field4,@Field5) ' +
          'END';
      Parameters.ParamByName('@Field1').Value:=Value1;
      Parameters.ParamByName('@Field2').Value:=Value2;
      Parameters.ParamByName('@Field3').Value:=Value3;
      Parameters.ParamByName('@Field4').Value:=Value4;
      Parameters.ParamByName('@Field5').Value:=Value5;
    试试
      

  7.   

    CommandText:=
          ' declare @Field1,@Field2,@Field3,@Field4,@Field5 int
           select @Field1 = :Field1,@Field2 = :Field2,@Field3 = :Field3 ,@Field4 = Field4,@Field5 =:Field5 
    IF NOT EXISTS (SELECT 1 FROM table1 '+
                        ' WHERE Field1=@Field1 AND Field2=@Field2 ' +
                        ' AND Field3=@Field3 AND Field4=@Field4) ' +
          'BEGIN' +
          '  INSERT table1 '+
          '  (Field1,Field2,Field3,Field4,Field5) '+
          '  VALUES(@Field1,@Field2,@Field3,@Field4,@Field5) ' +
          'END';
      Parameters.ParamByName('Field1').Value:=Value1;
      Parameters.ParamByName('Field2').Value:=Value2;
      Parameters.ParamByName('Field3').Value:=Value3;
      Parameters.ParamByName('Field4').Value:=Value4;
      Parameters.ParamByName('Field5').Value:=Value5;
    这样写应该没问题
      

  8.   

    参数名称不要重复,你有两个:FIELD1,
    CommandText:=
          'IF NOT EXISTS (SELECT 1 FROM table1 '+
                        ' WHERE Field1=:Field1 AND Field2=:Field2 ' +
                        ' AND Field3=:Field3 AND Field4=:Field4) ' +
          'BEGIN' +
          '  INSERT table1 '+
          '  (Field1,Field2,Field3,Field4,Field5) '+
          '  VALUES(:Field11,:Field12,:Field13,:Field14,:Field15) ' +
          'END';
      Parameters.ParamByName('Field1').Value:=Value1;
      Parameters.ParamByName('Field2').Value:=Value2;
      Parameters.ParamByName('Field3').Value:=Value3;
      Parameters.ParamByName('Field4').Value:=Value4;
      Parameters.ParamByName('Field11').Value:=Value1;
      Parameters.ParamByName('Field12').Value:=Value2;
      Parameters.ParamByName('Field13').Value:=Value3;
      Parameters.ParamByName('Field14').Value:=Value4;
      Parameters.ParamByName('Field15').Value:=Value5;
      

  9.   

    TO Focus(老鱼):我把“:”改成“@”,不行,提示找不到参数。使用catbuilder(为你飞扬)跟 belllab(bell)的方法出现同样的EXCEPTION
    “ exception class EOleException with message '不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。'”
    但我的表里根据就没有TEXT/IMAGE/NTEXT类型的字段,赋给参数的值也全都是STRING来的。莫名其妙。用yangdear()的方法成功了,但这样令到我的SQL语句变得非常的长了。 还有其他的方法吗?期待ING
      

  10.   

    d6中的ado有这个问题,d7中就没有了,试一试!应该没有问题
      

  11.   

    ado没有PARAMS,也没有paramsbyname.只有paramXXXXX忘了
      

  12.   

    to fenglaile:
       
        我用的就是7啊。to tonycjl(陈欣):   现在根本不是这个问题,如果没有的话在编译这关就通不过了。继续期待着……
      

  13.   

    哈哈,问题很简单,有同名参数!ADO 是不会对同名参数自动赋值的,而BDE会解决方案:
       1、如belllab(bell)所描述的那样,参数不同名
       2、不使用参数
       3、循环赋值同名参数(不使用ParamByName)
      

  14.   

    注:本人D7没用过,不知道D7中ADO有没有上述的问题,您可尝试一下
      

  15.   

    在d7安装盘中有个Mdac目录,里面的东西装一下,默认的时候是安装的,你的问题我也试过很多次了,从C++builder6到d6,d7,到了d7这个问题就少多了.
      

  16.   

    如果真的是“ADO 是不会对同名参数自动赋值的,而BDE会”,那我的迷团就解开了。谢谢大家,结贴了。