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

ybzsozfc  于 2023-04-11  发布在  其他
关注(0)|答案(5)|浏览(184)

根据http://www.delphigroups.info/2/3/181838.htmlarchive
ADO组件的首选方法是使用TADODataSet和TADOCommand。为了兼容性,提供了TADOQuery(以及TADOTable和TADOStoredProc)。
对返回结果集的SQL使用TADODataSet,对不返回结果集的SQL使用TADOCommand。
我是一个毫无头绪的初学者,谁是即将编码的大量ADO的东西。是上述声明正确吗?
有没有什么好的开源Windows程序可以让我可视化和探索我的数据库的内容?
我应该使用哪些组件来执行不返回结果的操作?

f2uvfpb9

f2uvfpb91#

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

txu3uszq

txu3uszq2#

我将走一半相反的路!- )
在某些情况下,TADOQuery可能适合两个作业。如果您的查询将导致数据使用TADOQuery.Acvite := True,如果您需要执行update\insert\delete使用TADOQuery.ExecSQL.
例如,您可以编写一个查询UPDATE\ INSERT和SELECT记录,并在一个组件中执行,而不是引入两个组件。

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

只是一个例子,现在写的。我希望你得到的想法。

l0oc07j2

l0oc07j23#

SqlBuddy是一个开源的数据库开发工具。

yptwkmov

yptwkmov4#

根据SQL对象的性质(TADOTable、TADOQuery和TADOStoredProc)操作/结果(TADODataSet和TADOCommand),这里有2种不同的分类
历史上的 Delphi 方法更多的是第一种,而ADO本质上更多的是第二种。
这两种方法都很有用,这取决于你想做什么。
我推荐你阅读Delphi中关于ADO组件的帮助。
例如,您会发现有用的注解,如:ADOdb.TADODataSet和SQLExpr.TSQLDataSet具有CommandType属性,可用于指定它们是表示表、查询还是存储过程。属性和方法名称与查询类型数据集最相似,但TADODataSet可用于指定类似于表类型数据集的索引。
如果您确定坚持使用ADO,并且永远不需要更改和移植到其他数据层,那么使用TADODataSet和TADOCommand走“ADO路线”。
你将得到最多的ADO与它,它将更容易使用MS文档和例子。

uoifb46i

uoifb46i5#

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 I。您可以直接使用Recordset接口(这并不难),或者您可以将其 Package 在友好的 Delphi Package 器类中:

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暴露为DataSet)*
    TADODataSet(无法下发DML)*
    TADOQuery(可下发DML和DQL)*
  • TCustomClientDataSet*(将内存中的表暴露为DataSet)*
  • TBDEDataSet*(将BDE暴露为DataSet)*
  • TCustomSQLDataSet*(将dbExpress暴露为DataSet)*
    TADOCommand是最接近发出原始查询的金属。
    TADODataSetTADOQuery使用 Delphi 现有的数据库对象模型公开ADO数据源
    TADODataSet只能表示数据集
    TADOQuery是万能的,可以做任何事情。

相关问题