根据http://www.delphigroups.info/2/3/181838.html
ADO的首选方法 组件是使用TADODataSet和 TADOCommand。 TADOQuery(和TADOTable 提供和TADOStoredProc) 兼容性。
对返回的SQL使用TADODataSet SQL的结果集和TADOCommand 没有。
我是一个无知的n00b - 谁将编写很多ADO的东西。以上陈述是否正确?
P.s是否有任何优秀的开源Windows程序可以让我直观地看到&探索我的数据库的内容?
我应该使用哪些组件来处理/不返回结果的内容?
答案 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)
用于发布返回数据集的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;
用于发布不返回数据集的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 :无法完成。如果语句
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
TADOCommand 最接近发出原始查询的金属。
TADODataSet 和 TADOQuery 使用Delphi的现有数据库对象模型公开ADO数据源
TADODataSet 仅可用于表示数据集
TADOQuery 是可以做所有事情的万事通。