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中的代码,为了编码的统一一致性,请求大家指点迷津。
在窗体上放置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中的代码,为了编码的统一一致性,请求大家指点迷津。
不过既然SQL里加了参数,程序里为什么不赋值呢?如果赋值了,运行结果就应该不会有什么问题了吧。
很可能丢失部分参数造成一些不可避免的失误,
但是在运行过程中,程序不报错,不能第一时间得到运行的情况,往往会遗漏。
哈哈,是个好办法,在复杂的程序中很难做到的,不可取;
我的目的是在运行的时候,如果没有参数赋值的时候立刻
给出错误信息来。继续;有好思路的给出个思路来。同时提醒,通过遍历的方式:
for I := 0 to Parameters.Count - 1 do
if VarIsNull(Parameters[I].Value) then
Raise Exception.Create('XXXXXXX');
通过这种方式也不可取,因为在程序中具有传递参数为Null
的情况。
或将Null转化为0或''的方式一样不可。