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

问题描述 投票:4回答:5

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

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

对于返回结果集的SQL使用TADODataSet,对于不返回结果集的SQL使用TADOCommand。

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


P.s有什么好的开源Windows程序可以让我可视化和探索我的数据库的内容吗?

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

delphi ado
5个回答
7
投票

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


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

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


3
投票

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


3
投票

根据SQL对象的性质(TADOTable,TADOQuery和TADOStoredProc)或操作/结果(TADODataSet和TADOCommand),您有两种不同的分类。 历史上的德尔菲方法更多的是第一种,而ADO本质上更多的是第二种。

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

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

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


1
投票

SELECT语句

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

  • TADOQuery qry.Sql.Text := 'SELECT * FROM Users WHERE Name = :username'; qry.Parameters.ParamByName('username').Value := 'ian'; qry.Open;
  • TADOTataSet kazxsopoi
  • TADOCommand ds.CommandText := 'SELECT * FROM Users WHERE Name = :username'; ds.Parameters.ParamByName('username').Value := 'ian'; ds.Open; ADOCommand将返回本机ADO IRecordset。您可以直接使用cmd.CommandText := 'SELECT * FROM Users WHERE Name = :username'; cmd.Parameters.ParamByName('username').Value := 'ian'; rs: _Recordset; rs := cmd.Execute; 界面(它并不难),或者您可以将其包装在友好的Delphi包装类中: Recordset 要么 ds.Recordset := rs;

INSERT,UPDATE,DELETE语句

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

  • TADOQuery qry.Recordset := rs;
  • TADOCommand qry.Sql.Text := 'DELETE FROM Users WHERE Name = :username'; qry.Parameters.ParamByName('username').Value := 'ian'; qry.ExecuteOptions := [eoExecuteNoRecords]; qry.ExecSql;
  • TADODataSet:无法完成。如果语句没有返回任何数据集,TADODataSet将抛出异常 cmd.CommandText := 'DELETE FROM Users WHERE Name = :username'; cmd.Parameters.ParamByName('username').Value := 'ian'; cmd.ExecuteOptions := [eoExecuteNoRecords]; cmd.Execute;

图表形式

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"

继承层次结构

  • TComponent TADOCommand(靠近原生ADO访问) TDataSet(Delphi的基础数据集模型) TCustomADODataSet(将ADO公开为DataSet) TADODataSet(不能发出DML) TADOQuery(可以发布DML和DQL) TCustomClientDataSet(将内存表公开为DataSet) TBDEDataSet(将BDE公开为DataSet) TCustomSQLDataSet(将dbExpress公开为DataSet)

TADOCommand是最接近金属的,用于发出原始查询。

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

TADODataSet只能用于表示数据集

TADOQuery是可以做任何事情的万事通。

© www.soinside.com 2019 - 2024. All rights reserved.