Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 Powershell使用ExecuteOnQuery()尝试捕获_Sql_Powershell_Error Handling_Runtime Error - Fatal编程技术网

Sql Powershell使用ExecuteOnQuery()尝试捕获

Sql Powershell使用ExecuteOnQuery()尝试捕获,sql,powershell,error-handling,runtime-error,Sql,Powershell,Error Handling,Runtime Error,我正在编写一个powershell脚本,它将跨多个服务器执行一个脚本。 使用将脚本转换为exe后 当我关闭窗口时,如果在try-catch中捕获到任何错误,我将得到一个错误 $ErrorActionPreference = 'Continue' $dataAdapter = new-object System.Data.SqlClient.SqlCommand ($ExeStatement, $connString); $dataAdapter.Connection.Open()

我正在编写一个powershell脚本,它将跨多个服务器执行一个脚本。 使用将脚本转换为exe后

当我关闭窗口时,如果在try-catch中捕获到任何错误,我将得到一个错误

$ErrorActionPreference = 'Continue'
    $dataAdapter = new-object System.Data.SqlClient.SqlCommand ($ExeStatement, $connString);
    $dataAdapter.Connection.Open();
    $dataAdapter.CommandTimeout = 65535;
    Try {
        $dataAdapter.ExecuteNonQuery()}
    catch{
         $ErrorCounter = $ErrorCounter + 1
         $dataAdapter.Connection.Close();}
    finally{
         $dataAdapter.Connection.Close();}
如果我删除了try-catch,那么当捕捉到错误时,我可以很好地关闭窗口。 如果我删除$dataAdapter.CommandTimeout=65535;当捕捉到错误时,我能够很好地关闭窗口,但我需要它,因为其中一个脚本相当长。 如果我将ErrorActionPreference设置为STOP,它也可以正常工作。尽管我希望能够继续处理错误并在最后报告

在关闭窗口时,我从windows收到以下错误

说明:已停止工作

问题签名:
问题事件名称:CLR20r3
问题签名01:PROGRAMNAME.exe
问题签名02:0.0.0.0
问题签名03:53bdc0d9
问题签名04:mscorlib
问题签名05:2.0.0.0
问题签名06:5174de33
问题签名07:34a9
问题签名08:18c
问题签名09:System.IO.IOException
操作系统版本:6.1.7601.2.1.0.16.7
区域设置ID:1033
DefaultDataCollection失败:0x8007001f


我需要脚本能够继续处理错误,但我还需要捕获错误。

删除“finally”块并关闭连接时会发生什么

        try {
            $dataAdapter.ExecuteNonQuery()
        }
        catch {
            $ErrorCounter = $ErrorCounter + 1
        }
        $dataAdapter.Connection.Close()


您的exec在没有错误的情况下完成时是否返回任何内容?运行完成后,可能会将其更改为返回0或其他内容。我猜适配器正在等待返回某些内容(即使它不是查询),因此如果没有错误,您永远不会到达finally块并关闭连接。

我猜OP已经解决了这个问题,但是对于任何偶然发现它的人,可能的修复方法是,当他捕获到错误时,他尝试关闭数据适配器两次:一次在catch块中,一次在finally块中,但它已经在catch块中关闭

OP注意到只有当他有错误时才会发生这种情况。是的,因为这是导致双重关闭的唯一条件


简单的解决方法是从catch块中删除数据适配器close,让finally块处理它。

只有当错误返回时,如果我在catch之外抛出close,或者在try内部抛出close,我会得到相同的错误。如果ExecuteNonQuery给出错误,则永远不会执行Connection.close(第二种情况)。在第二种情况下,只有在try catch之外预定义了$dataAdapter时,才能执行Connection.Close(在这种情况下应该可以工作,但最好是注释以供将来参考)。请提供建议的响应作为示例,这样更好。
        try {
            $dataAdapter.ExecuteNonQuery()
            $dataAdapter.Connection.Close()
        }
        catch {
            $ErrorCounter = $ErrorCounter + 1
        }