我需要使用BDE将参数传递给Delphi中的SQL以使用“in”,如下例所示:
select * from customers where id in (:p_in)
我需要传递:p_in一个客户列表。但是Query.ParamByName.('p_in').AsString: = '1, 2,3 ',
它没有用..将不得不制作一个数组?或者由AsVariant传递?
答案 0 :(得分:5)
您必须动态构建SQL。 (不过,请参阅我的答案的后半部分。)
var
SQLStr: string;
i: Integer;
begin
SQLStr := 'SELECT * FROM Customers WHERE id IN (';
for i := 0 to CustomerList.Count - 1 do
SQLStr := SQLStr + QuotedStr(CustomerList[i]) + ',';
// Replace final extra comma with closing ')'
SQLStr[Length(SQLStr)] := ')';
MyQuery.SQL.Text := SQLStr;
...
end;
请注意,为了防止SQL注入,您应该使用参数化SQL执行此操作,尽管需要更多工作。这也可行,并且更安全:
var
SQLStr: string;
i: Integer;
begin
SQLStr := 'SELECT * FROM Customers WHERE id IN (';
// Add parameters to hold values like `:ID`
for i := 0 to CustomerList.Count - 1 do
SQLStr := SQLStr + Format(':ID%d,' [i]);
// Remove final extra comma and replace with closing ')', and
// then assign it to MyQry.SQL; the query will parse the params
if CustomerList.Empty then
SQLStr := SQLStr + ')'
else
SQLStr[Length(SQLStr)] := ')';
MyQuery.SQL.Text := SQLStr;
// Populate the parameters
for i := 0 to CustomerList.Count - 1 do
MyQuery.ParamByName(Format('ID%d', [i])).AsString := CustomerList[i];
// Execute query
MyQuery.Open;
end;
如果SQL中没有其他参数,也可以直接替换它们,但如果稍后更改查询并添加一个参数,则直接通过索引访问它们会导致问题
新参数!只需用这个代替第二个for
循环:
for i := 0 to CustomerList.Count - 1 do
MyQuery.Params[i].AsString := CustomerList[i];
答案 1 :(得分:1)
试试这个:
p_in : String ;
for i := 0 to Customerlist.count do
p_in := p_in +Customerlist[i] + ',';
MyQuery.text := 'select * from customers where id in (' + p_in + ' )' ;
答案 2 :(得分:1)
由于不推荐使用BDE,请考虑使用允许替换参数的现代组件。 例如:
SomeDataSet.SQL.Add('select foo from bar where baz in (:TESTIDS)');
SomeDataSet.DeclareVariable('TESTIDS', otSubst); // <- this does the trick
// Place here some loop that fills the list of test-id separated by a ","
// And then:
SomeDataSet.SetVariable('TESTIDS', myIDList); // Drop the list into the variable
不同的组件制造商可能会使用不同的名称。