-4

我承认我没有直接在 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 中使用静态日期运行时不同。行数太少。我从这个项目复制了设置。我认为运行一个 sql 查询需要 5 个组件很奇怪。见图片。

SQL 查询

可以简化吗?这是我对组件的声明。

SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dspTopExceptions: TDataSetProvider;
cdsTopExceptions: TClientDataSet;
dsTopExceptions: TDataSource;

编辑: 最后我找到了它不起作用的原因。我怀疑有故障的驱动程序等,但这是一个简单的愚蠢错误。我连接到一个小型测试数据库而不是更大的数据库。现在它适用于 3 个组件和参数。抱歉耽误您的时间:)

SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dsTopExceptions: TDataSource;

问候

4

1 回答 1

8

简短回答:不,您不需要 5 个组件

从 Delphi 对数据库运行查询通常涉及两个组件:

  • 连接组件,负责建立数据库连接,以及
  • 一个支持查询的组件,负责运行查询并获取结果。

一些数据层允许您直接使用具有查询功能的组件而无需显式连接组件,但连接组件始终是在幕后创建的。其中之一是 ADO。

因此,如果您使用 ADO,您只需TADOQuery在您的 Form/DataModule 中放置一个并针对支持的数据库(例如 SQL Server)执行您的选择(或任何其他)查询。

为了做到这一点,你设置了ConnectionStringADOQuerySQL属性,然后你Open的查询和数据就在那里。

更多信息

数据访问

您还可以在不同的可用数据访问权限之间进行选择。有些支持连接到多个数据库,如 DBGo (ADO) 和 DBExpress (DBX),还有一些支持连接到一个数据库,如 Interbase Express (IBX) 和 Direct Oracle Access (DOA) 等。

如您所见,可用的不同选项为您提供了一组不同的功能和独特的特性。

那么,为什么要使用 5 个组件呢?

好吧,您可能正在研究其他人编写的应用程序,或者正在学习教程。

使用这些组件是因为它们添加了更高级和复杂的数据访问功能。

  • TClientDataSet/TDataSetProvider:TClientDataSet 允许您在完全可导航的数据集中拥有数据的内存副本,这也可以在与数据库断开连接的情况下工作,甚至可以将数据与修改一起存储到磁盘或从磁盘检索数据( delta) 对其进行修改,然后再应用该更改(甚至几天或几个月后)。

    您还可以对数据进行排序、创建内存索引、计算聚合等。

    TDataSetProvider 是源数据集(例如 TSQLQuery)和 TClientDataSet 之间的粘合剂,它使您能够在不进行任何编码的情况下连接两者,从源数据集中提取数据,还可以在晚点。

    如果您想了解更多关于 TClientDataSets 和 TDataSetProviders 的信息,请查看Cary Jensen 的 ClientDataSets 书

  • TDataSource:这是 Delphi 数据库架构的一部分,它允许您使用数据感知组件,如 TDBEdit、TDBGrid、TDBLabel 等。数据源也用于创建主/从关系。如果您不想使用该组件或关系,则不需要它。

于 2013-01-25T22:10:01.457 回答