如何为这样的sql语句指定参数?(100分)

  • 主题发起人 主题发起人 wx
  • 开始时间 开始时间
W

wx

Unregistered / Unconfirmed
GUEST, unregistred user!
select * from xxx where xx in ('aa','bb','cc');改成参数表示为:

select * from xxx where xx in :xxxx;

paraname('xxxx')
|
|---------->后面怎样写??
 
不可能用parambyname('xxxx')来实现上述问题.

下面是一个简单的变通办法:

设计时 query1.sql.text可以写成如下形式
SELECT * FROM XXX WHERE XX IN (%s)

procedure TForm1.Button1Click(Sender: TObject);
var
xxxx: string;
s: string;
begin
xxxx:='"aa","bb","cc","dd"';
s:=query1.sql.text;
query1.sql.text:=format(s,[xxxx]);
query1.open;
......
......
query1.close;
query1.sql.text:=s;
end;
 
.
.
Query1.SQL.Add('Where 硕士点="'+Edit2.Text+'"');
.
.
这是我用过的动态替换方式,方法有点笨,但绝对没有问题 :-)
 
这种问题没什么太好的办法,
Another_eYes说得差不多。
但是必须要事先把SQL语句存起来,
不然query1.sql.text:=s;之后
下次再用可就出错了。
 
我对TQUERY的认为是,其SQL属性为TSTRINGS类型,所以我们可以动态组成一句SQL
然后在赋给相应TQUERY的SQL属性。示例如下:
query1.sql.add('select * from animals where weight=2');
query1.open;
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select * from animals');
query1.first;
if query1.RecordCount>0 then
begin
s:='where name in (';
while not query1.EOF do
begin
if s<>'where name in (' then s:=s+',';
s:=s+''''+query1.fieldbyname('name').value+'''';
query1.Next;
end;
s:=s+')';
query2.sql.Add(s);
end;
query2.Open;
希望对您有帮助。
 
paraname('xxxx').asstring:='('aa','bb','cc')'
 
delphi fan2的方法早已经过实验,证实无法通过.
 
如果Params数目固定,且数量较少,方法如下:
Query1.SQL.Text:='select 8 from xxx where xx in (:xx1,:xx2,:xx3...);
Query1.ParamByName('xx1').AsString:='aa';
Query1.ParamByName('xx2').AsString:='bb';
Query1.ParamByName('xx3').AsString:='cc';
Query1.Open;

如果Params数目不是固定的,或者数量较多,Another_eYes的方法比较实用。

 
最好还是在程序中生成SQL语句
with Query1 do
begin
close;
SQL.Clear;
SQL.add('select * from XXX where XX in('
+chr(39)+edit1.Text+chr(39)+','
+chr(39)+edit2.Text+chr(39)+','
+chr(39)+edit3.Text+chr(39)
+')');
open;
end;

另 : 这种情况用ParamByName()非常慢。
 
最好还是在程序中生成SQL语句
with Query1 do
begin
close;
SQL.Clear;
SQL.add('select * from XXX where XX in('
+chr(39)+edit1.Text+chr(39)+','
+chr(39)+edit2.Text+chr(39)+','
+chr(39)+edit3.Text+chr(39)
+')');
open;
end;

另 : 这种情况用ParamByName()非常慢。
 
最好动态生成SQL:
Var SelectClause:String;
WhereClause:String;
OrderByclause:String;
Begin
SelectClause := 'Select * from tablename where ';
WhereClause := 'xx in (' + '"xx1,xx2,xx3...")';
Orderbyclause := ' Order by zz';
With query1 do
Begin
close;
SQL.Clear;
SQL.add(Selectclause);
SQL.add(whereclause);
Sql.add(orderbyclause);
Prepare;
Open;
End;
End;
 
这里不能用parambyname,比较灵活一点的方法是采用Another_eYes的方法
使用format函数,如果程序此sql只用一次也可以用生成sql的方法,不过看
起来不是很规范 :-)
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部