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

r9f1avp5  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(180)

我使用的是一个FireDacTFDQuery,它通过一个TDBGrid连接到SQLite数据库。当单击工具栏上的按钮时,我想运行一个查询,以获得与给定条件匹配的记录计数,而不影响TDBGrid。在这种情况下是如何设计的?
TIA!!

rqqzpn5f

rqqzpn5f1#

如果您想要一个可以完全在应用程序中计算的替代方案,而不必对服务器发出新命令,那么您可以临时克隆数据集。
该克隆不会影响您的TDBGrid,因此您可以根据需要的任何条件进行过滤,并返回满足该条件的记录数。
示例:

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模式下工作时,这也非常有用,因为它将正确地计算屏幕上的记录,即使它们尚未应用到数据库。

xqk2d5yq

xqk2d5yq2#

这里有一个可能的答案--在同一个连接上创建一个全新的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;
}

相关问题