2017-01-27 11 views
0

私は基本的にcsvファイルを読み込み、関連するms-accessデータベースレコードを検索して更新するスクリプトを用意しています。問題は、100-150レコード後には遅くなります。誰かがそれについて意見を持つことができます。しかし、最初のレコードが速く実装されていると考えてください、それはなぜ私のためのその奇妙な問題です。ところで、スクリプトはサーバー上ではなくローカルPC上で動作します。Accessデータベースを使用したPowerShellスクリプトの高速化

$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

あなたはrsを一度開いてから、読んでループして、最後にrsを閉じます。 – Gustav

答えて

1

解決しました。 Open関数でselect文を作るのは悪い決断です。一度にすべてのデータを取得し、それをRS.Filterでフィルタリングするのは完全に解決策になります。

$ rs.Filter = "[列1] = ' "+ $のparam1 +"' と[列2] =" IRは

$ rsをクリアすることができ、計算、アップグレード後に+ $ PARAM2

。フィルタ= 0

ありがとうございます。

関連する問題