Delphi / ADO:哪些组件? TADODataSet和TADOCommand还是TADOQuery?

时间:2010-06-01 08:34:54

标签: delphi ado

根据http://www.delphigroups.info/2/3/181838.html

  

ADO的首选方法   组件是使用TADODataSet和   TADOCommand。 TADOQuery(和TADOTable   提供和TADOStoredProc)   兼容性。

     

对返回的SQL使用TADODataSet   SQL的结果集和TADOCommand   没有。

我是一个无知的n00b - 谁将编写很多ADO的东西。以上陈述是否正确?


P.s是否有任何优秀的开源Windows程序可以让我直观地看到&探索我的数据库的内容?

我应该使用哪些组件来处理/不返回结果的内容?

5 个答案:

答案 0 :(得分:7)

该陈述是正确的。 TADODataset和TADOCommand是本机ADO对象的直接接口,可以执行其他三个任务所做的所有任务,这些任务可以轻松移植为BDE(Borland数据库引擎)编写的应用程序,实现类似的接口 - 它们最终调用前两个。

答案 1 :(得分:4)

我会去半对立! ; - )

在某些情况下,TADOQuery可以很好地适应两个的工作。 如果您的查询将导致数据使用TADOQuery.Acvite := True, 如果需要执行update \ insert \ delete,请使用TADOQuery.ExecSQL.

例如,您可以向UPDATE \ INSERT写一个查询并选择一条记录,并在一个组件中执行,而不是引入两个。

DECLARE @ID int, @Mode int, @SomeValue varchar(20)

SET @ID = :ID
SET @Mode = :Mode
SET @SomeValue = :SomeValue 

IF (@Mode = 1) //INSERT
BEGIN
  INSERT INTO dbo.YourTable(ID, SomeColumn) VALUES(@ID, @SomeValue)
END ELSE
IF (@Mode = 2) //UPDATE
BEGIN
  UPDATE dbo.YourTable SET SomeValue = @SomeValue WHERE ID = @ID
END ELSE
IF (@Mode = 3) //DELETE
BEGIN
  DELETE FROM dbo.YourTable WHERE ID = @ID
END ELSE
IF (@Mode = 4) //SELECT
BEGIN
  IF (@ID = -1) //SELECT ALL
  BEGIN
    SELECT * FROM dbo.YourTable
  END ELSE
  BEGIN
    SELECT * FROM dbo.YourTable WHERE ID = @ID
  END
END

只是一个例子,现在写。我希望你明白这一点。

答案 2 :(得分:3)

您使用哪个数据库? SqlBuddy是用于探索数据库的开源IDE。

答案 3 :(得分:3)

此处有 2个不同的分类,具体取决于SQL对象的性质(TADOTable,TADOQuery和TADOStoredProc)操作/结果(TADODataSet和TADOCommand)即可。
历史上的德尔菲方法更多的是第一种,而ADO本质上更多的是第二种。

取决于你想做什么,两者都很有用。

我建议你阅读ADO组件上的Delphi帮助 例如,你会找到有用的笔记,如: “ADOdb.TADODataSet和SQLExpr.TSQLDataSet具有CommandType属性,允许您指定它们是表示表,查询还是存储过程。属性和方法名称与查询类型数据集最相似,尽管TADODataSet允许您指定类似于的索引表类型数据集。“

如果您确定坚持使用ADO 并且永远不需要更改并移植到其他数据层,那么使用TADODataSet和TADOCommand 进入“ADO路线”。<登记/> 您将充分利用它的ADO,并且使用MS文档和示例将更容易。

答案 4 :(得分:1)

SELECT语句

用于发布返回数据集的DQL语句(例如SELECT)

  • TADOQuery

    qry.Sql.Text := 'SELECT * FROM Users WHERE Name = :username';
    qry.Parameters.ParamByName('username').Value := 'ian';
    qry.Open;
    
  • TADODataSet

    ds.CommandText := 'SELECT * FROM Users WHERE Name = :username';
    ds.Parameters.ParamByName('username').Value := 'ian';
    ds.Open;
    
  • TADOCommand

    cmd.CommandText := 'SELECT * FROM Users WHERE Name = :username';
    cmd.Parameters.ParamByName('username').Value := 'ian';
    rs: _Recordset;
    rs := cmd.Execute;
    

    ADOCommand将返回本地ADO IRecordset。您可以直接使用Recordset界面(并不难),也可以将其包装在友好的Delphi包装器类中:

    ds.Recordset := rs;
    

    qry.Recordset := rs;
    

INSERT,UPDATE,DELETE语句

用于发布不返回数据集的DML语句(例如INSERT,UPDATE,DELETE)

  • TADOQuery

    qry.Sql.Text := 'DELETE FROM Users WHERE Name = :username';
    qry.Parameters.ParamByName('username').Value := 'ian';
    qry.ExecuteOptions := [eoExecuteNoRecords];
    qry.ExecSql;
    
  • TADOCommand

    cmd.CommandText := 'DELETE FROM Users WHERE Name = :username';
    cmd.Parameters.ParamByName('username').Value := 'ian';
    cmd.ExecuteOptions := [eoExecuteNoRecords];
    cmd.Execute;
    
  • TADODataSet :无法完成。如果语句

    没有返回数据集,则TADODataSet将引发异常。
    ds.CommandText := 'DELETE FROM Users WHERE Name = :username';
    ds.Parameters.ParamByName('username').Value := 'ian';
    ds.ExecuteOptions := [eoExecuteNoRecords];
    ds.Open; // <-- Exception: "CommandText does not return a result set"
    

图表形式

| Component   | Issue command | Return rows |
|-------------|---------------|-------------| 
| TADODataSet |  No           |  Yes        |
| TADOCommand |  Yes          |  Yes¹       |
| TADOQuery   |  Yes          |  Yes        |

¹ Recordset interface

继承层次结构

  • TComponent
    • TADOCommand (本机ADO访问权限附近)
    • TDataSet (Delphi的基本数据集模型)
      • TCustomADODataSet (将ADO作为数据集公开)
        • TADODataSet (无法发布DML)
        • TADOQuery (可以发布DML和DQL)
      • TCustomClientDataSet (将内存表作为数据集公开)
      • TBDEDataSet (将BDE作为数据集公开)
      • TCustomSQLDataSet (将dbExpress暴露为DataSet)

TADOCommand 最接近发出原始查询的金属。

TADODataSet TADOQuery 使用Delphi的现有数据库对象模型公开ADO数据源

TADODataSet 仅可用于表示数据集

TADOQuery 是可以做所有事情的万事通。