我用param来写的sql
commandtext := 'select * from xxx where colvalue in (:aparam)';
parambyname('aparam').value := atext;类似这样的方式
其中atext 是一个字符串,string或者widestring,传入的实际参数大概是'a', 'b', 'c'这样的单步到parambyname那一步的时候,确定atext是'a', 'b', 'c',但是通过跟踪发现,变成了''a'', ''b'', ''c'',造成结果与预期不符合不知何故我用的是D7,SQL SERVER2K的数据库先放50分,不够追加
commandtext := 'select * from xxx where colvalue in (:aparam)';
parambyname('aparam').value := atext;类似这样的方式
其中atext 是一个字符串,string或者widestring,传入的实际参数大概是'a', 'b', 'c'这样的单步到parambyname那一步的时候,确定atext是'a', 'b', 'c',但是通过跟踪发现,变成了''a'', ''b'', ''c'',造成结果与预期不符合不知何故我用的是D7,SQL SERVER2K的数据库先放50分,不够追加
:aparam不是数组,你想实现的是数组
commandtext := 'select * from xxx where colvalue=:aparam';
parambyname('aparam').value := atext; 这样试试不可以吗
LZ是想通过一个参数将in 的条件全部传进去吧
但是param在赋值的时候将'转义了, 字符窜中''代表一个'
所以变成了''a'', ''b'', ''c''
'select * from xxx where colvalue in ('+atext+')';
这样赋值,试试atext:=''''+'a'+''''+','+''''+'b'+''''+','+''''+'c'+'''';
parambyname('aparam').value := atext; 如果不行,你可以把跟踪commandtext的值,剪切出来,在查询分析器中运行,直到调试成功。
''a'',''b'',''c''这些是我通过sqlserver的事件探查器截取到的信息我不知道这样会不会是正常,但是查询的结果肯定是不正常(没有找出我想要的数据)
事实上我就是这么写的而且把SQL通过查询分析器来执行完全没有问题,当然,SQL里的参数是换成实际值后再查询分析器中使用的
从一个列表中读过来的,某个对象的某个字段,通过代码拼接而成a
b
c
...'a' + 'b' + 'c'
因为是string类型的,所以作为SQL参数的时候,我加了单引号
如果用param会在整个参数上加''号
like表达的是模糊匹配,in是判断是否在一个有限的范围内。
这样赋值,试试 atext:=''''+'a'+''''+','+''''+'b'+''''+','+''''+'c'+'''';
parambyname('aparam').value := atext; 如果不行,你可以把跟踪commandtext的值,剪切出来,在查询分析器中运行,直到调试成功。
commandtext := 'select * from xxx where colvalue in ('''+atext+''')';
直接在SQL语句中加入字符串,'select * from xxx where colvalue in ('+atext+')'
你是要求查询参数是不确定的,个数也是不确定的,这实际是涉及到SQL查询参数是动态变化的,个数也是动态变化的.
我们首先分析一下你的语句:
commandtext := 'select * from xxx where colvalue in (:aparam)';
parambyname('aparam').value := atext;
但这样在运行时,'select * from xxx where colvalue in (:aparam)'就会并且只会被解释成'select * from xxx where colvalue =:aparam'问题解决:
分析知,查询语句是字符串,那我们就可以利用字符串的特点,添加参数个数.
具体实现可以考虑以下语句:
ADOQuery.SQL.add("select * from xxx where colvalue in (:para " + IntToStr(i))
你先看一下,自己能不能解决.
http://publishblog.blogchina.com/blog/tb.b?diaryID=6735099
ADOQuery.SQL.add("select * from xxx where colvalue in (:para " + IntToStr(i)) 这样在运行时,语句将被解释成 select * from xxx where colvalue =:parai ,参数变成parai而不是para. 仅这样是不够的,当只有一个参数时,上述查询语句是正确的,但当有多个参数时,参数之间是要加","隔开的. 采用循环可实现: //n表示实际参数个数,可以动态变化 ADOQuery.close ; ADOQuery.SQL.clear ; ADOQuery.SQL.add("select * from xxx where colvalue in (:para " + IntToStr(0)) ; //当参数个数多于2个 for i:=0 to n-1 do ADOQuery.SQL.add(' ,:para ' + IntToStr(i)) ; //为SQL语句末尾加上右括号 ADOQuery.SQL.add(' )') ; //然后只要利用ADOQuery.Parameters[i].value为所有参数赋值即可
感谢!我现在也是这个思路,仍然采用commandtext和parambyname只是由于改动的地方较多,故还没下手我想这样做应该可行
如果有更好的方法,请各位指教
http://wjbmcsd.bokee.com/
listParam : TStrings;
strSql : String;
i : Integer;
begin
listParam := TStringList.Create(nil);
listParam.Delimiter := ',';
listParam.DelimitedText := atext;
if(listParam.Count > 0)then
begin
strSql:= 'select * from xxx where colvalue in(';
for i := 0 to listParam.Count - 1 do
begin
strSql := strSql + ':param' + IntToStr(i);
if(i <> listParam.Count - 1) then
strSql := strSql + ', ';
end;
strSql := strSql + ')';
commandtext := strSql;
for i := 0 to listParam.Count - 1 do
parambyname('param' + IntToStr(i)).value := listParam.Strings[i];
end;
end
如果是赋给值按 atext := ''''+s+''''形式赋给 ;ADOQuery.SQL.text := 'select * from xxx where colvalue in ('+atext+') ' ;