1

允许用户通过在 tedit 框中键入文本并单击按钮来搜索数据库表中记录的最佳方法是什么,然后结果将显示在 tcxgrid 上。

我有一个 tadquery/datasource,它正在查看一个包含各种字段的表。如果用户能够在表中搜索多个字段,那就太好了。

谢谢。

4

2 回答 2

0

您可以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,只需将Typesand添加StrUtils到您的 uses 子句并使用SplitStringandTStringDynArray代替:

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;
于 2015-03-17T14:19:18.090 回答
0

我将对数据源使用查询,并在按钮的 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;

我已经多次使用过这种技术。

于 2015-03-17T16:16:15.040 回答