允许用户通过在 tedit 框中键入文本并单击按钮来搜索数据库表中记录的最佳方法是什么,然后结果将显示在 tcxgrid 上。
我有一个 tadquery/datasource,它正在查看一个包含各种字段的表。如果用户能够在表中搜索多个字段,那就太好了。
谢谢。
允许用户通过在 tedit 框中键入文本并单击按钮来搜索数据库表中记录的最佳方法是什么,然后结果将显示在 tcxgrid 上。
我有一个 tadquery/datasource,它正在查看一个包含各种字段的表。如果用户能够在表中搜索多个字段,那就太好了。
谢谢。
您可以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;
对于包含之前的 Delphi 版本TStringHelper
(例如您正在使用的 XE2,只需将Types
and添加StrUtils
到您的 uses 子句并使用SplitString
andTStringDynArray
代替:
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;
我将对数据源使用查询,并在按钮的 onclick 事件中,使用 WHERE 子句重新加载查询
Query1.SQL.Add('WHERE Name LIKE :P1 OR Postcode LIKE :P2 OR Town LIKE :P3');
并添加参数
Query1.SQL.Parameters.ParamByName('P1').Value := '%' + Edit1.Text + '%';
Query1.SQL.Parameters.ParamByName('P2').Value := '%' + Edit1.Text + '%';
Query1.SQL.Parameters.ParamByName('P3').Value := '%' + Edit1.Text + '%';
使用 '%' 允许搜索字符串中的任何位置作为选项。
Query1.Open;
我已经多次使用过这种技术。