2017-01-27 2 views
0

J'ai un script, qui consiste essentiellement à lire un fichier csv et à rechercher les enregistrements de base de données ms-access associés et à les mettre à jour. Le problème est qu'il devient plus lent après 100-150 enregistrements. Quelqu'un peut-il avoir une opinion à ce sujet? Mais s'il vous plaît considérez que les premiers enregistrements sont implémentés rapidement, c'est pourquoi son étrange problème pour moi. D'ailleurs, le script s'exécute sur un ordinateur local, pas sur un serveur.Accélération du script PowerShell avec la base de données Access

$adOpenStatic = 3 
$adLockOptimistic = 3 
$cn = new-object -comobject ADODB.Connection 
$rs = new-object -comobject ADODB.Recordset 
$cn.Open("Provider = Microsoft.ACE.OLEDB.12.0;Data Source = $path") 
Write-Host "database connection established" 

$data = Import-Csv $csvfile 

$data =$data | Where-Object{$_.b} 
$itemNo=0 
$dp=1 
$fp=1 
$total=0 

$Verkaufsbeleg=0 
$Verkaufsbelegposition=0 


foreach ($element in $data) { 


       if($itemNo -ne $element.d + $element.f -and $element.d){       
        $itemNo=$element.d + $element.f 

        $Verkaufsbeleg=$element.d 

        $Verkaufsbelegposition=$element.f 

        $param1= [convert]::ToInt32($Verkaufsbeleg, 10) 
        $param2=[convert]::ToInt32($Verkaufsbelegposition, 10) 

        write-host $param1 
        write-host $param2 

        $dp=0 
        $fp=0 
        $position=99  


       } 

       if($element.k -eq $something){ 
        $dp++ 
       }elseif($element.k -eq $something){ 
        $fp++ 
       } 


       $rs.Open("Select * From Projects where ([Column1]='"+$param1+"' and [Column2]="+$param2+")", $cn,$adOpenStatic,$adLockOptimistic) 


       While ($rs.EOF -ne $True) { 

        $value=$element.i     

        if($element.k -eq $something){ 

         $rs.Fields.Item("DP")=$value 

         $total++           
        } 
        if($element.k -eq $something){ 

         $rs.Fields.Item("FP")=$value 

         $total++           
        } 

        write-host "Index" $rs.AbsolutePosition 

        $rs.MoveNext() 

       }  

       $rs.Close()  
       $rs= new-object -comobject ADODB.Recordset 

} 


$cn.Close() 
Write-Host "Total Items Updated" $total 
+0

Vous ouvrez rs une fois, puis faites votre lecture et la boucle, enfin fermer rs. – Gustav

Répondre

1

J'ai résolu. c'est une mauvaise décision de faire une instruction select avec la fonction Open. Prendre toutes les données en une seule fois et filtrer avec RS.Filter sera une solution complète.

$ rs.Filter = "[Colonne1] = ' "+ param1 $ +"' et [Colonne2] =" + param2 $

après des calculs et des mises à niveau ir peuvent être effacées par

$ rs. Filtre = 0

Merci