我承认我没有直接在Delphi中使用SQL的经验。但我现在尝试了一个小项目。它执行这个SQL
SELECT [Type], [Sum] = Count(*)
FROM exceptionrow
WHERE LogDate >= :FromDate
AND LOGDATE <= :ToDate
GROUP BY [type]
ORDER BY [sum] DESC
FromDate和ToDate的参数为TDateTime。 这是要执行的事件。
procedure TLogsStats.CollectTopExceptions(aFromDate, aToDate: TDateTime);
begin
qryTopExceptions.ParamByName('FromDate').AsDate := aFromDate;
qryTopExceptions.ParamByName('ToDate').AsDate := aToDate;
cdsTopExceptions.Close;
cdsTopExceptions.Open;
end;
我在DBGrid中得到的结果与在具有静态日期的SQL Studio中直接运行时的结果不同。行太少了。我从此project复制了设置。我认为只需运行一个SQL查询就需要5个组件,这很奇怪。见图。
可以简化吗? 以下是我对组件的声明。
SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dspTopExceptions: TDataSetProvider;
cdsTopExceptions: TClientDataSet;
dsTopExceptions: TDataSource;
修改 最后我发现它不起作用的原因。我怀疑有错误的司机等但这是一个简单的愚蠢错误。我连接到一个小型测试数据库而不是更大的数据库。现在它可以正常使用3个组件和参数。抱歉你的时间:)
SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dsTopExceptions: TDataSource;
此致
答案 0 :(得分:8)
从Delphi对数据库运行查询通常涉及两个组件:
某些数据层允许您直接使用具有查询功能的组件而不使用显式连接组件,但始终在后台创建连接组件。其中一个是ADO。
因此,如果您使用ADO,则可以在Form / DataModule中放置TADOQuery
,并针对受支持的数据库(例如SQL Server)执行select(或任何其他)查询。
为此,您需要设置ConnectionString
和ADOQuery
属性的SQL
属性,然后Open
您的查询,您的数据就在那里。
数据访问
您还可以选择不同的数据访问方式。有些支持连接到多个数据库,如DBGo(ADO)和DBExpress(DBX),还有其他数据库支持只连接到一个数据库,如Interbase Express(IBX)和Direct Oracle Access(DOA)等。
如您所见,可用的不同选项为您提供了一组不同的功能和独特的特征。
那么,为什么还要包含5个组件?
好吧,你可能正在寻找其他人写的应用程序,或者按照教程进行编写。
使用这些组件是因为它们增加了更高级和更复杂的数据访问功能。
TClientDataSet / TDataSetProvider:TClientDataSet允许您在完全可导航的数据集中拥有数据的内存中副本,这也可以与数据库断开连接,甚至可以存储和检索数据到/从磁盘以及对其进行的修改(delta),然后应用该更改(甚至几天或几个月后)。
您还可以对数据进行排序,创建内存索引,计算聚合等等。
TDataSetProvider是源DataSet(例如TSQLQuery)和TClientDataSet之间的粘合剂,使您能够连接两者而无需任何编码,从源数据集中提取数据,还可以应用修改的增量它在以后的时间。
如果您想了解有关TClientDataSets和TDataSetProviders的更多信息,请查看ClientDataSets book by Cary Jensen
TDataSource:这是Delphi数据库架构的一部分,它允许您使用数据感知组件,如TDBEdit,TDBGrid,TDBLabel等。 DataSource还用于创建主/明细关系。如果您不想使用该组件或关系,则不需要它。