Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行可能返回或不返回数据的SQL脚本?_Sql_Sql Server_Delphi_Ado - Fatal编程技术网

如何执行可能返回或不返回数据的SQL脚本?

如何执行可能返回或不返回数据的SQL脚本?,sql,sql-server,delphi,ado,Sql,Sql Server,Delphi,Ado,这是一个扩展,答案与我所问的不完全一致。我正在做的是在MS SQL Server数据库上执行SQL脚本。此脚本可能返回也可能不返回任何记录集。问题是ADO组件的工作方式,至少据我所知,我只能显式地请求其中一个 如果我知道查询将返回数据,我将使用TADOQuery.Open 如果我知道查询不会返回数据,我将使用TADOConnection.Execute 如果我不知道查询是否会返回数据 如何执行任何查询并读取响应以确定它是否有任何记录集,以便读取该记录集 我所尝试的: 调用TADOQuery.

这是一个扩展,答案与我所问的不完全一致。我正在做的是在MS SQL Server数据库上执行SQL脚本。此脚本可能返回也可能不返回任何记录集。问题是ADO组件的工作方式,至少据我所知,我只能显式地请求其中一个

  • 如果我知道查询将返回数据,我将使用
    TADOQuery.Open
  • 如果我知道查询不会返回数据,我将使用
    TADOConnection.Execute
  • 如果我不知道查询是否会返回数据
如何执行任何查询并读取响应以确定它是否有任何记录集,以便读取该记录集

我所尝试的:

  • 调用
    TADOQuery.Open
    ,但如果没有记录集,则引发异常
  • 调用
    TADOQuery.ExecSql
    ,但从不返回任何数据
  • 调用
    TADOConnection.Execute
    ,但从不返回任何数据
  • 使用选项
    3
    并在异常情况下恢复到选项
    1
    ,但这是工作的两倍(脚本文件超过38000行),而且有点讨厌
  • 使用
    TADOCommand.Execute
    ,但在创建某些存储过程时不断引发“参数对象定义不正确。提供了不一致或不完整的信息”(否则在使用
    TADOConnection.Execute时不会发生这种情况)
  • 调用
    TADOConnection.Execute
    重载,它返回
    \u记录集
    ,但是
    TADOConnection.Errors
    返回空(我依赖于此)
  • 正如一些背景知识一样,其目的是在SQLServerManagementStudio中实现类似于SQL查询工具的东西。它允许您执行任何SQL脚本,如果它返回任何记录集,它将显示它们,否则只显示输出消息。我正在使用的工具会在
    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