ADOQuery.SQL.Add时,后面应该是Open还是ExecSQL?
解决方案 »
- 鼠标右击点关闭时出错?
- 请教:各位大哥这样的函数要怎么写?谢谢!
- 介绍几本好书
- 怎么实现数据库的联级查询
- 你了解delphi吗,今天发现一个很怪的问题.delphi7.0下.
- Delphi 连接SQL Server的密码是单引号,连接字符串如何写??
- 请问在DELPHI4中如何实现DBGRID的列冻结功能?
- 寻找学友,小弟想学delphi,有哪位想交流一下,我的qq:955805
- 如何把一个窗体设置成平面样式呀,就是ctl3D=False那样,不要立体的
- 如何接收串口数据?
- 为什么有时候一个控件纵有焦点,只要是按回车,就是它响应?
- 把一个表中的数据导出到Excel ,或都是DBGRID中的数据导也到Excel.
ExecSQL对INSERT、UPDATE、DELETE等数据库记录改变的操作
ExecSQL对INSERT、UPDATE、DELETE等数据库记录改变的操作 这两句是一直都这样还是有例外的时候?
如果是open有返回数据的用open;
想写一个SQL查询及执行器,现在碰到的问题是例如我用ADODataSet(或者用CoreLab的DAC系列控件)当用户输入一条SQL后,这句SQL有可能是有返回结果集的(例如用select语句),也有可能没有返回结果集的(例如用Delete或update),那么应如何使用办呢,究竟用DataSet的Open还是Execute方法呢?
如果用Open的话,对于没有结果集返回时就会报错,如果用Exectue的话,那么又不会返回结果集。
那么应如何解决这个问题?
试试我的这个方法,肯定行。
首先用ADOConnection.execute执行命令,我试过了执行 select、Delete、存储过程都没问题。
var aaa:_Recordset;aaa:= ADOConnection1.Execute('exec Add_Assigner ''000'', ''002''');
aaa:= ADOConnection1.Execute('select * From Table1');
aaa:= ADOConnection1.Execute('Delete From Table1 Where Code=''00''');
(上面语句一次选一个就行了,我是上述三种类似都试过了,都不会出错)
if Assigned(aaa) then
if aaa.Fields.Count > 0 then
ADODataSet1.Recordset := aaa;原理:其实无论ADOQUERY还是ADOTABLE,最终都是执行adoconn.execute来执行语句或都存储过程的
execute有两种方式,
一种是不返回结果,是PROCEDURE
procedure TADOConnection.Execute(const CommandText: WideString;
var RecordsAffected: Integer; const ExecuteOptions: TExecuteOptions = [eoExecuteNoRecords]);
var
VarRecsAffected: OleVariant;
begin
CheckActive;
ConnectionObject.Execute(CommandText, VarRecsAffected,
adCmdText+ExecuteOptionsToOrd(ExecuteOptions));
RecordsAffected := VarRecsAffected;
end;一种是返回结果,是Function
function TADOConnection.Execute(const CommandText: WideString;
const CommandType: TCommandType = cmdText;
const ExecuteOptions: TExecuteOptions = []): _Recordset;
var
VarRecsAffected: OleVariant;
begin
CheckActive;
Result := ConnectionObject.Execute(CommandText, VarRecsAffected,
Integer(CommandTypeValues[CommandType])+ExecuteOptionsToOrd(ExecuteOptions));
end;如果数据集控件是用execsql的,就调用procedure execute, 相反就调用 function execute, 交叉时就会出错楼上讲的提示。 现在我们把这过程提前到先用function ADOCONN.EXECUTE()执行语句,然后自行判断有无结果返回,如有,才直接将结果赋值给ADODataSet显示,避免DELPHI默认的用ADOQuery.Open就调用funtion execute, 用EXECSQL就调用Procedure execute , 这样就可以解决楼主的问题了。