我正在使用
FireDac
TFDQuery
连接到 SQLite
数据库与 TDBGrid
。单击工具栏上的按钮时,我想运行查询以获取符合给定条件的记录数,而不会影响TDBGrid
。在这种情况下如何设计?
TIA!!
这是一个可能的答案——在同一个连接上创建一个全新的
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;
}
如果您想要一个可以完全在您的应用程序中计算的替代方案,而无需针对您的服务器启动新命令,那么您可以临时克隆您的数据集。
在该克隆上,您可以根据需要的任何条件进行过滤,并返回满足该条件的记录数。
例子:
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 模式下工作时也非常有用,因为它会正确计算屏幕上的记录,即使它们尚未应用于数据库。