我有一个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”参数调用“Read”的异常:“Transaction(Process ID 107)与另一个进程锁定资源死锁并且已经死锁 被选为死锁受害者。重新运行交易。“在 C:\ script.ps1:83 char:17 + while($ rdr.read<<<<<()){ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException
我在数据库中有大约18,000台计算机。抛出此异常时,它只读取10,000,它会不时变化。
如何处理异常以便它读取所有18,000台计算机?
答案 0 :(得分: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()
但是,更好的方法是识别并避免死锁情况(如果可能的话)。