adoquery参数传递机制

张得一 2012-07-26 10:05:35
一直对adoquery的参数传递机制很疑惑。
比如说sql.text := 'select * from (select * from a left join b on XX=XX where a.XX=:参数1) a';
然后我用Parameters.parambyname('参数1').value := '';传递参数,
接着去open这个query。就会出现错误。跟踪了sqlserver的事件探查器,发现原因是adoquery给sqlserver传的语句中,:参数的类型是text,然后sqlserver就会提示text类型不是直接用"="比较。
再比如我用Parameters.parambyname('参数1').value := '参数';传递参数,
然后执行这个query,这个query传递给sqlserver的语句里面又会把:参数的类型变成varchar(1),这样又把参数给截断了,又得不到我想要的结果了。我给Parameters.parambyname('参数1').datatype赋值也没用,会提示错误。
希望哪位达人能帮忙解决一下
...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
张得一 2012-07-27
  • 打赏
  • 举报
回复
可以为空的 不能为空报错就不奇怪了
7年 2012-07-26
  • 打赏
  • 举报
回复

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'select acco_name from (select * from bs_acco_info where acco_id=:e) a';
ADOQuery1.Parameters.ParamByName('e').Value := '0111000005';
ADOQuery1.Open;


exec sp_executesql N'select acco_name from (select * from bs_acco_info where acco_id=@P1) a
',N'@P1 varchar(10)','0111000005'


没出现你说的情况啊,是varchar(10)啊,都是自动匹配的啊
7年 2012-07-26
  • 打赏
  • 举报
回复
那个参数能空吗?不能空当然报错啊
张得一 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Delphi(Pascal) code


ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'select acco_name from (select * from bs_acco_info where acco_id=:e) a';
ADOQuery1.Parameters.ParamByNam……
[/Quote]

要是ADOQuery1.Parameters.ParamByName('e').Value := ''; 这样呢 事件探察器里会出现什么样的语句

是不是要出现 exec sp_executesql N'select acco_name from (select * from bs_acco_info where acco_id=@P1) a
','@P1 text','' 然后报错





2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧