您可以为此使用TDataSet.Locate,传递以分号分隔的字段名称列表和要匹配的常量字段值数组。通常,这很容易:
DataSet.Locate('Field1;Field2', ['Value1', 'Value2'], [loPartialKey]);
但是,由于您不提前知道有多少列,您需要以不同方式处理数组,使用 VarArrayCreate 并分别设置每个数组值。
这个例子从Edit1(用分号分隔)中获取字段列表,从Edit2(同样,用分号分隔,字符串值被'字符包围,所以它们是正确地包含在数组中)。它将Edit1 的内容拆分为一个数组以找出有多少元素,分配一个适当大小的变量数组,填充它,然后将字段列表和值数组都传递给TDataSet.Locate。已使用Edit1.Text := 'Customer_No;Name'; 和Edit2.Text := '1;''Smith'''; 进行了测试。
procedure TForm5.Button1Click(Sender: TObject);
var
Temp: string;
Fields: TArray<string>;
Vals: TArray<string>;
FieldValues: Variant;
i: Integer;
begin
// Grab a copy so we can split it into separate values
Temp := Edit1.Text;
Fields := Temp.Split([';']);
// Create the array of variants to hold the field values
FieldValues := VarArrayCreate([0, High(Fields)], VarVariant);
// Temporary copy to allow splitting into individual values
Temp := Edit2.Text;
Vals := Temp.Split([';']);
for i := 0 to High(Fields) do
FieldValues[i] := Vals[i];
// Use original field list from Edit1 for the Locate operation
DataSet1.Locate(Edit1.Text, FieldValues, [loCaseInsensitive]);
end;
对于包含TStringHelper 之前的Delphi 版本(例如您正在使用的XE2,只需将Types 和StrUtils 添加到您的uses 子句并使用SplitString 和TStringDynArray 代替:
procedure TForm5.Button1Click(Sender: TObject);
var
Temp: string;
Fields: TStringDynArray;
Vals: TStringDynArray;
FieldValues: Variant;
i: Integer;
begin
Temp := Edit1.Text;
Fields := SplitString(Temp, ';');
FieldValues := VarArrayCreate([0, Length(Fields)], VarVariant);
Temp := Edit2.Text;
Vals := SplitString(Temp, ';');
for i := 0 to High(Fields) do
FieldValues[i] := Vals[i];
DataSet1.Locate(Temp, FieldValues, [loCaseInsensitive]);
end;