1

我正在使用 Locate 方法在 TADOTable 中进行搜索,但它不适用于多字段搜索。(我直接在 TADOTable 上搜索,因此在这种情况下对 SQL 不感兴趣)。

以下代码在使用单个字段时工作正常,但不适用于多个字段!

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TLocateOptions LOpts;
        LOpts.Clear();
        LOpts << loPartialKey;
        Variant VAR[1];
        VAR[0] = Variant(Edit1->Text);

        try{
          if ( ADOTable1->Locate("CompanyID;Supplier", VAR, LOpts) ){
            // Record found
          }
        }
        catch(...){}
}
4

1 回答 1

2

在 a 中搜索多个字段TADODataSet与使用其他字段几乎相同TDataSet,使用Locate函数和可选TLocateOptions

if ADODataSet1.Locate('CompanyID;Supplier', 
                      VarArrayOf([Edit1.Text, Edit2.Text]), 
                      [loPartialKey]) then
begin
  // Record found
end;

正如您的评论表明您实际上正在使用 C++Builder 和TADOTable,这是一个适用于它的示例(在新的 VCL Forms 应用程序中在 C++Builder XE5 下编译和测试):

TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;

Variant locateValues[2];
locateValues[0] = Variant(Edit1->Text);
locateValues[1] = Variant(Edit2->Text);

if (ADOTable1->Locate("CompanyID;Supplier", VarArrayOf(locateValues, 1), Opts))
{
  // Record found.
};

您对原始问题的评论表明您真正想要的是搜索两列以查看它们是否与值匹配。您不能使用单个Locate. 当然,两列都必须是相同的数据类型 - 如果不转换某些内容,就不能在数字字段和字符字段中搜索相同的数字(或字符)值:

var
  LastName: Variant;
begin
  LastName := Edit1.Text;
  if ADOTable1.Locate('LastName', LastName, [loPartialKey]) or
     ADOTable1.Locate('CompanyName', LastName, [loPartialKey]) then
  begin
    // Record found
  end;

另一种选择是使用Filter(同样,Delphi 代码 - 直接的 C++ Builder 翻译):

AdoTable1.Filter := 'LastName = ' + QuotedStr(Edit1.Text) +
                    ' or CompanyName LIKE "' + QuotedStr(Edit1.Text) + '%"';
AdoTable1.Filtered := True;
AdoTable1.First;
// Get key values needed to locate on a full key, and then clear the filter.
于 2014-02-13T16:58:16.757 回答