我正在使用 TSQLConnection 和 TSQLDataSet 从 Delphi 应用程序中查询 SQL Server (2012) 数据库。到目前为止,我的所有查询都运行良好,但是我现在正在尝试使用 INNER JOIN 编写 SELECT 查询,但我无法访问 TSQLDataSet 的任何输出。
编码:
Query_text:='SELECT Table1.Price
'FROM [Table1]
'INNER JOIN [Table2]
'ON Table1.Code_ID = Table2.ID'
'WHERE (Table2.Code = '+QuotedStr(Temp_code)+')';
SQL_dataset.CommandType:=ctQuery;
SQL_dataset.CommandText:=Query_text;
SQL_dataset.Open;
If SQL_dataset.RecordCount>0 then .... { THIS RETURNS NOTHING }
如果我将此查询输入 SSMS,则会返回正确的信息。在我使用的所有其他 SELECT 查询(没有 INNER JOIN)中,SQL_dataset 按预期返回记录计数和字段名。
关于问题是什么以及如何解决它的任何想法?
更新:
我关于 TSQLDataset.RecordCount 的信息:
http://docwiki.embarcadero.com/Libraries/XE4/en/Data.SqlExpr.TCustomSQLDataSet.RecordCount
从这里我没有得到它不适用于简单查询的印象 - 到目前为止,我已经成功地将它与简单的 SELECT 查询一起用作查询是否返回任何数据的标志......我只是幸运吗?但是,上面的链接确实指出它不适用于参数化查询和多表连接,所以这似乎解释了我原来的问题!非常感谢您为我指明了正确的方向。
此链接表明,如果 Bof 和 Eof 都为真,则结果集为空:
http://docwiki.embarcadero.com/Libraries/XE4/en/Data.DB.TDataSet.Eof
If SQL_dataset.Bof=True and SQL_dataset.Eof=True then
begin
Found:=False;
这是一个更好的选择吗?
更新 2:
感谢您的解释,这对我来说开始有意义了。我已经删除了对 RecordCount 的所有引用,并按照建议替换为 TSQLDataset.isEmpty(我完全错过了该方法,谢谢)。
我原以为只要您调用 TSQLDataset.Open 就会填充 TSQLDataset.RecordCount ,但如果我理解正确,情况并非如此?
有时我会滚动浏览结果,如下所示:
SQL_dataset.CommandType:=ctQuery;
SQL_dataset.CommandText:=Query_text;
SQL_dataset.Open;
If SQL_dataset.IsEmpty=False then
begin
SQL_dataset.First;
While not SQL_dataset.Eof do
begin
{ DO SOMETHING }
SQL_dataset.Next;
end;
end;
这显然确实调用了 TSQLDataset.Next,所以我假设这会完成您所说的所有内存缓冲(根据 RecordCount)。这究竟是在什么时候发生的?