0

我需要使用 BDE 将参数传递给 Delphi 中的 SQL 以使用“in”,示例如下:

select * from customers where id in (:p_in)

我需要通过:p_in 客户列表。但是Query.ParamByName.('p_in').AsString: = '1, 2,3 ',它没有用..将不得不制作一个数组?还是通过 AsVariant 传递?

4

3 回答 3

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];
于 2013-04-08T21:45:06.947 回答
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  + ' )' ;
于 2013-04-08T21:11:27.573 回答
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

不同的组件制造商可能为此使用不同的名称。

于 2013-04-09T06:43:47.713 回答