0

データベース (MS SQL 2008) からコンピューター情報の行を読み取り、それをリーダーに格納する powershell があります。

# 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" 個の引数を指定して "Read" を呼び出す例外: "トランザクション (プロセス 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 に答える