получить доступ к ошибкам блокировки базы данных и сбоям скрипта (oleaut32.dll) - PullRequest
0 голосов
/ 07 октября 2018

Попытка использования пространств выполнения для выполнения некоторых операций веб-очистки и вставки в базу данных.при попытке многопоточности задания более одного потока приводит к ошибкам блокировки базы данных и к аварийному завершению работы моего скрипта.Я использую соединение adodb с базой данных доступа.

Function InsertToTable1 {
    param ($database,$query,$col2,$col3,$col4,$col5,$col6,$col7,$col8,$col9,$col10,$col11)
    $OpenStatic = 3
    $LockOptimistic = 3
    $Connection = New-Object -ComObject ADODB.Connection
    $Connection.Open("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=$database") 
    $Recordset = new-object -ComObject ADODB.Recordset
    $Recordset.open($query,$Connection,$OpenStatic,$LockOptimistic)
    $Recordset.AddNew()
    $Recordset.Fields.Item("col2") = $col2
    $Recordset.Fields.Item("col3") = $col3
    $Recordset.Fields.Item("col4") = $col4
    $Recordset.Fields.Item("col5") = $col5
    $Recordset.Fields.Item("col6") = $col6
    $Recordset.Fields.Item("col7") = $col7
    $Recordset.Fields.Item("col8") = $col8
    $Recordset.Fields.Item("col9") = $col9
    $Recordset.Fields.Item("col10") = $col10
    $Recordset.Fields.Item("col11") = $col11
    $Recordset.Update()
    $Recordset.close()
    $Connection.close()
}
$code = @"
Function InsertToTable1 {$(Get-Command InsertToTable1 | Select -expand Definition)}
"@ #

$pool = [RunspaceFactory]::CreateRunspacePool(1,1) #[int]$env:NUMBER_OF_PROCESSORS+1
$pool.ApartmentState = "MTA"
$pool.Open()
$runspaces = @()

$scriptblock = {
                ......
                InsertToTable1 $DB $Q1 $varState $varTown $varStreet $fullURL $varStyle $varModel $varDescription $varUseCode $varDate $varDate
                ......
                }

    foreach ($x in $xxxxx) {
        $runspace = [PowerShell]::Create().AddScript($scriptblock).AddArgument($x).AddArgument($code)
        $runspace.RunspacePool = $pool

    # Add runspace to runspaces collection and "start" it
        # Asynchronously runs the commands of the PowerShell object pipeline
        $runspaces += [PSCustomObject]@{ Pipe = $runspace; Status = $runspace.BeginInvoke() }
    }
     while ($runspaces.Status.IsCompleted -notcontains $true) {}

    $results = @()
    foreach ($runspace in $runspaces ) {
        $results = $runspace.Pipe.EndInvoke($runspace.Status)
        $runspace.Pipe.Dispose()
    }
    $pool.Close() 
    $pool.Dispose()
...