具有变量参数的函数

use*_*012 0 delphi function variant tadoquery

我创建了一个函数来刷新带参数的查询,然后找到一个特定的字段.

function RefreshQuery(AQuery : TADOQuery; AField : string; AValue : integer; AParam : string; AParamValue : Variant) : boolean; overload;
Run Code Online (Sandbox Code Playgroud)

当AValue是整数时,当我将其更改为Variant时,它可以工作

我得到一个列表索引超出界限1699364错误.

函数本身如下所示:

function RefreshQuery(AQuery : TADOQuery; AField : string; AValue : integer; AParam : string; AParamValue : Variant) : boolean; overload;
var AfterOpen,AfterScroll,BeforeOpen : TDataSetNotifyEvent;
    AList : TStringList;
    i : integer;
begin
  result:=false;

  AfterOpen := AQuery.AfterOpen;
  AfterScroll := AQuery.AfterScroll;
  BeforeOpen := AQuery.BeforeOpen;

  AQuery.AfterOpen:=nil;
  AQuery.AfterScroll:=nil;
  AQuery.BeforeOpen:=nil;

  AList := TStringList.Create;
  AList.Delimiter:=';';
  AList.DelimitedText:=AParam;

  if AQuery.Active then AQuery.Close;

  if AList.Count = 1 then
    AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue // the error happens here
  else
    for i := 0 to AList.Count-1 do
      AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue[i];

  AQuery.Open;

  if not AQuery.Locate(AField, AValue, []) then
    result:=false
  else
    result:=true;

  AQuery.AfterOpen:=AfterOpen;
  AQuery.AfterScroll:=AfterScroll;
  AQuery.BeforeOpen:=BeforeOpen;

  if Assigned(AQuery.AfterScroll) then
    AQuery.AfterScroll(AQuery);

  AList.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

  if   RefreshQuery(CityQuery,'id',CityQueryID.Value,'Active',not(CheckBox1.Checked).ToInteger+2) = false then
  begin
    MessageDlg('blabla!',mtWarning, [mbOK], 0);
    Exit;
  end;
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,CityQueryID.Value是Integer Type.但有时候我想使用String.所以我想改变函数以使用Variants.

Mar*_*ynA 5

发生错误是因为在声明中

  if AList.Count = 1 then
    AQuery.Parameters.ParamByName(AList[i]).Value:=AParamValue // the error happens here
Run Code Online (Sandbox Code Playgroud)

你还没有i为它赋值,因为它是一个局部变量,它将具有一个随机值,具体取决于在调用之前堆栈上的RefreshQuery内容.

将语句更改为

  if AList.Count = 1 then
    AQuery.Parameters.ParamByName(AList[0]).Value:=AParamValue
Run Code Online (Sandbox Code Playgroud)

应该解决问题.

完成后,您应该发现可以将参数类型更改AValuevariant没有问题.