Powershell使用ExecuteNonQuery尝试捕获()

时间:2014-07-10 16:36:23

标签: sql powershell error-handling runtime-error

我正在开发一个PowerShell脚本,它将跨多个服务器执行脚本。 使用http://ps2exe.codeplex.com/

将我的脚本转换为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

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

2 个答案:

答案 0 :(得分:1)

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

OP 指出,这仅在他出现错误时才会发生。是的,因为这是导致双重关闭的唯一条件。

简单的答案是从 catch 块中移除数据适配器 close 并让 finally 块来处理它。

答案 1 :(得分:0)

当您最终删除“'阻止并关闭连接?

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

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

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