A:
在窗体上放置ADOConnection1, ADOQuery1,Button1,设置适当后,
Button1OnClick:事件如下
begin
  ADOQuery1.SQL.Text := 'SELECT * FROM Pub_Employee WHERE emp_id = :emp_id' ;  
  ADOQuery1.Open;
end;
该程序没有为参数赋值,可以正常运行,且不报任何错误!(由于忘记赋参数值导致运行结果错误)为解决该问题:
1. 检查其SQL低层运行脚本为:
exec sp_executesql N'SELECT * FROM Pub_Employee WHERE emp_id = @P1 ', N'@P1 int', NULL
其中的参数被自动设置了值为:Null;2. 设置其参数类型后:
ADOQuery1.ParamCheck := True;
ADOQuery1.Parameters.ParamByName('Emp_ID').DataType := ftInteger;
问题同上;3. 追踪Delphi的原代码后,发现其参数TParameter在创建时将自动为其初始化为:Value = Null,
且其在赋值时不检查参数赋值情况即可直接运行。B:
但是如果上述SQL为
  ADOQuery1.SQL.Text := ' DECLARE @Emp_ID INT    SET @Emp_ID = :Emp_ID      ' + #13 + 
                        ' SELECT * FROM Pub_Employee WHERE emp_id = :emp_id ' ;
则运行报错,将指定SQL没有为指定参数设置值;由于程序中有大量的如同A中的代码,为了编码的统一一致性,请求大家指点迷津。

解决方案 »

  1.   

    这个还真是,以前没注意过。
    不过既然SQL里加了参数,程序里为什么不赋值呢?如果赋值了,运行结果就应该不会有什么问题了吧。
      

  2.   

    在工程量非常大的项目中,由于种种原因(修改或替换,也可能SQL是由几个不同的部分组成的),
    很可能丢失部分参数造成一些不可避免的失误,
    但是在运行过程中,程序不报错,不能第一时间得到运行的情况,往往会遗漏。
      

  3.   


    哈哈,是个好办法,在复杂的程序中很难做到的,不可取;
    我的目的是在运行的时候,如果没有参数赋值的时候立刻
    给出错误信息来。继续;有好思路的给出个思路来。同时提醒,通过遍历的方式:
    for I := 0 to Parameters.Count - 1 do
      if VarIsNull(Parameters[I].Value) then
        Raise Exception.Create('XXXXXXX');
    通过这种方式也不可取,因为在程序中具有传递参数为Null
    的情况。
    或将Null转化为0或''的方式一样不可。
      

  4.   

    但是,如果是B情况的话,那么如果不赋值的话,ADO将会报错,并给出提示。应该是内部的机制不同吧?