查询基于 FireDac 的 TDBGrid 以获取基于给定条件的匹配记录计数的正确方法是什么?

问题描述 投票:0回答:2

我正在使用

FireDac
TFDQuery
连接到
SQLite
数据库与
TDBGrid
。单击工具栏上的按钮时,我想运行查询以获取符合给定条件的记录数,而不会影响
TDBGrid
。在这种情况下如何设计?

TIA!!

delphi c++builder firedac
2个回答
0
投票

这是一个可能的答案——在同一个连接上创建一个全新的

TFDQuery
对象。我不知道这是否是目前的“答案”,但这似乎符合我的要求:

int count=0;
try {
  TFDQuery *myquery=new TFDQuery(NULL);
  __try {
    myquery->Connection=MyDataModule->MySqlLiteConnection;
    try {
      myquery->Open(_T("SELECT COUNT(*) from TableName where FieldName=:V"), OPENARRAY(Variant, (reinterpret_cast<intptr_t>(TreeNode->Data))));
      count=myquery->Fields->Fields[0]->AsInteger;
      myquery->Close();
    }  
    catch (...) { };
  } 
  __finally {
    delete myquery;
  }
}
catch (...) { };

我刚开始使用 try/catch try/finally,但它似乎比旧学校更麻烦:

int count=0;
TFDQuery *myquery;
if ((myquery=new TFDQuery(NULL))!=NULL) {
  myquery->Connection=MyDataModule->MySqlLiteConnection;
  if (myquery->Open(_T("SELECT COUNT(*) from TableName where FieldName=:V"), OPENARRAY(Variant, (reinterpret_cast<intptr_t>(TreeNode->Data))))) {
    count=myquery->Fields->Fields[0]->AsInteger;
    myquery->Close();
  }  
  delete myquery;
}

0
投票

如果您想要一个可以完全在您的应用程序中计算的替代方案,而无需针对您的服务器启动新命令,那么您可以临时克隆您的数据集。

在该克隆上,您可以根据需要的任何条件进行过滤,并返回满足该条件的记录数。

例子:

procedure MyButtonClick(Sender: TObject);
var MyClone: TDataset;
begin
  MYClone := MyQuery.GetClonedDataset(False);
  MyClone.Filter := 'FieldName = ' + QuotedStr(SearchValue);
  MyClone.Filtered := True;
  ShowMessage(MyClone.RecordCount.ToString + ' records found');
  MyClone.Free;
end;

这在 CachedUpdates 模式下工作时也非常有用,因为它会正确计算屏幕上的记录,即使它们尚未应用于数据库。

© www.soinside.com 2019 - 2024. All rights reserved.