2016-09-14 58 views
0

我想通過使用OracleDataReader的Powershell從Oracle DB獲取一些數據。事情似乎工作正常,除了我alwyas得到一個有限的數據集。說,40條記錄,同時它返回超過5000與SQL管理器應用程序的我。我錯過了某種抓取大小或超時?如何讓我把整套數據變成可用的?通過OracleDataReader執行SQL查詢總是返回有限的一組數據

$connection = New-Object System.Data.OracleClient.OracleConnection($connectionString) 
$command = New-Object System.Data.OracleClient.OracleCommand($query, $connection) 
$connection.Open() 
[System.Data.OracleClient.OracleDataReader]$data = $command.ExecuteReader() 

$Counter = $data.FieldCount 
$ObjArray = @() 
while ($data.Read()) { 
$Obj = New-Object System.Management.Automation.PSObject 
    0..($Counter - 1) | % { 
       $Obj | Add-Member -MemberType NoteProperty -Name $data.GetName($_) -Value $data.GetValue($_) 
    } 
     $ObjArray += $Obj 
} 
$connection.Close() 
return $ObjArray 

回答

0

我會跳過數組創建並直接將結果傳遞給管道。 PSObject和數組也很容易解開。改爲嘗試此解決方案(代碼取自http://dev.cdur.pl/Artykuly/PowerShell-wykonywanie-polecen-SQL-Server):

function Invoke-Sql(
    $ConnectionString, 
    $Query 
) { 
    $conn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString) 
    $cmd = New-Object System.Data.OracleClient.OracleCommand($Query,$conn) 
    $conn.Open() 
    $reader = $cmd.ExecuteReader() 
    if ($reader.Read()) { 
     [string[]]$columns = 0..($reader.FieldCount-1) | 
      % { if ($reader.GetName($_)) { $reader.GetName($_) } else { "(no name $_)" } } 
     do { 
     $obj = @{} 
     0..($reader.FieldCount-1) | % { $obj.Add($columns[$_], $reader[$_]) } 
     [PSCustomObject]$obj 
     } while ($reader.Read()) 
    } 
    $reader.Dispose() 
    $cmd.Dispose() 
    $conn.Dispose() 
} 
+0

感謝您的回覆。我忘記提及我正在使用Powershell v2,因此語法不起作用,但您的代碼也會返回有限的一組數據,可悲的是。 –