0

我有一个 powershell,它从数据库(MS SQL 2008)中读取计算机信息行并将其存储到阅读器中。

# Open the database connection
$conn.Open()

# Create and execute the SQL Query

$cmd = New-Object System.Data.SqlClient.SqlCommand($sql,$conn)

$rdr = $cmd.ExecuteReader()

# Read Computer Information into multidimensional array
$count=0
while ($rdr.read()){
    $sql_output += ,@($rdr.GetValue(0), $rdr.GetValue(1), $rdr.GetValue(2), 
    $rdr.GetValue(3))
    $count=$count + 1
}


# Close the database connection
$conn.Close()    

Write-host Finished reading $count IP addresses from database 

大约 50% 的时间,我得到一个例外

使用“0”参数调用“读取”的异常:“事务(进程 ID 107)在锁定资源上与另一个进程死锁,并已被选为死锁受害者。重新运行事务。” 在 C:\script.ps1:83 char:17 + while ($rdr.read <<<< ()){ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

我的数据库中有大约 18,000 台计算机。当抛出这个异常时,它可能只读取 10,000,它会不时变化。

如何处理异常以读取所有 18,000 台计算机?

4

1 回答 1

1

尝试将执行包装在一个try..catch块和一个循环中,如下所示:

$conn.Open()
$cmd = New-Object System.Data.SqlClient.SqlCommand($sql,$conn)

do {
  try {
    $rdr = $cmd.ExecuteReader()

    $count=0
    while ($rdr.read()) {
      $sql_output += ,@($rdr.GetValue(0), $rdr.GetValue(1), $rdr.GetValue(2),
                        $rdr.GetValue(3))
      $count=$count + 1
    }

    $transactionComplete = $true
  } catch {
    $transactionComplete = $false
  }
} until ($transactionComplete)

$conn.Close()

但是,更好的方法是识别并避免死锁条件(如果可能)。

于 2013-06-19T15:08:18.140 回答