如何执行可能返回或不返回数据的SQL脚本?
这是一个扩展,答案与我所问的不完全一致。我正在做的是在MS SQL Server数据库上执行SQL脚本。此脚本可能返回也可能不返回任何记录集。问题是ADO组件的工作方式,至少据我所知,我只能显式地请求其中一个如何执行可能返回或不返回数据的SQL脚本?,sql,sql-server,delphi,ado,Sql,Sql Server,Delphi,Ado,这是一个扩展,答案与我所问的不完全一致。我正在做的是在MS SQL Server数据库上执行SQL脚本。此脚本可能返回也可能不返回任何记录集。问题是ADO组件的工作方式,至少据我所知,我只能显式地请求其中一个 如果我知道查询将返回数据,我将使用TADOQuery.Open 如果我知道查询不会返回数据,我将使用TADOConnection.Execute 如果我不知道查询是否会返回数据 如何执行任何查询并读取响应以确定它是否有任何记录集,以便读取该记录集 我所尝试的: 调用TADOQuery.
- 如果我知道查询将返回数据,我将使用
TADOQuery.Open
- 如果我知道查询不会返回数据,我将使用
TADOConnection.Execute
- 如果我不知道查询是否会返回数据李>
TADOQuery.Open
,但如果没有记录集,则引发异常TADOQuery.ExecSql
,但从不返回任何数据TADOConnection.Execute
,但从不返回任何数据3
并在异常情况下恢复到选项1
,但这是工作的两倍(脚本文件超过38000行),而且有点讨厌TADOCommand.Execute
,但在创建某些存储过程时不断引发“参数对象定义不正确。提供了不一致或不完整的信息”(否则在使用TADOConnection.Execute时不会发生这种情况)
TADOConnection.Execute
重载,它返回\u记录集
,但是TADOConnection.Errors
返回空(我依赖于此)GO
语句中自动中断SQL脚本,并分别执行每个单独的块。其中一些块可能返回数据,而另一些块可能不返回数据。很明显,我不能在执行之前做出这个决定,所以我正在寻找一种方法来继续执行并观察结果TADOConnection.Execute
提供一些有用的信息,包括错误(或输出消息)
到目前为止,我唯一的选择是在用户界面中提供一个选项,允许用户选择要使用的执行类型——但这正是我试图消除的
编辑
TADOCommand.Execute
方法最接近我想要的。但是,它在脚本的某些部分失败,否则使用TADOConnection.Execute
,这些部分工作得非常好。参见上文第5章“我所尝试的”。我几乎把它作为我的答案,直到我发现这个错误几乎发生在所有的事情上
编辑
在将我的答案发布到下面之后,我了解到当我使用另一个重载Execute
时,Errors
属性不再返回任何内容。参见上文第6章“我所尝试的”
呼叫
ADOConnection1.Execute('select * from something', cmdText, []);
…不返回ADOConnection1中的任何内容。错误
,而
var
R: Integer;
begin
ADOConnection1.Execute('select * from something', R);
…在
ADOConnection1中返回消息。错误
,这正是我需要的,但不会返回任何记录集。编辑:不是正确的解决方案
经过更深入的挖掘,我终于找到了解决办法。答案是使用TADOConnection.Execute()
重载,它支持返回记录集:
function TADOConnection.Execute(const CommandText: WideString;
const CommandType: TCommandType = cmdText;
const ExecuteOptions: TExecuteOptions = []): _Recordset;
然后,只需将生成的\u记录集
分配给受支持的数据集组件的记录集
属性
var
RS: _Recordset;
begin
RS := ADOConnection1.Execute('select * from something', cmdText, []);
if Assigned(RS) then begin
ADODataset1.Recordset:= RS;
...
end;
end;
缺点是不能使用另一个重载,该重载支持返回
行受影响的
。此外,当使用此重载版本的Execute
时,TADOConnection
的Errors
属性中不会返回任何内容,而另一个则会返回。但是另一个不会返回记录集。遗憾的是,当使用此重载时,它不会返回错误中的任何消息。这似乎只有在使用我以前使用的重载版本时才起作用。我开始怀疑是否应该使用原始OLE自动化。需要时薛定谔在哪里?只需添加另一条语句,并使用简单的select open检查结果集的计数。不止一个?您从原始声明中得到了一个结果。那是it@SirRufo那是上面第四次审判,我没有说清楚。但问题更深——请阅读我的最新编辑/answer.Related/replicate