2014-10-12 70 views
1

我必须使用powershell查询许多oracle数据库表。 有没有办法动态构建用于读者对象成员的变量?powershell oracle查询 - 动态分配读者对象成员

我必须指定读者对象成员名称,例如GetInt64(3),GetString(4)等,以便我检索表中每列的值。

由于我必须列举具有不同列名的很多表,因此编写这些表的工作量会很大。

我该如何编写它,以便我可以使用变量名称而不是成员名称? thnx - 这是我在这个网站上的第一篇文章。

这是我的问题中正在引用的下面的代码的一部分。

. 
. 
$premise=$reader.GetInt64(3) 
$license=$reader.GetString(4) 
$invoice_num=$reader.GetInt64(5) 
. 
. 
. 

我从这个链接得到这个例子(我不知道我应该张贴在同一线程: Handling nulls in powershell

# Create a datareader for a SQL statement 
$sql="select * from legacydb.ebt_invoice_dtl where premnum = 397743" 
$command = New-Object Oracle.DataAccess.Client.OracleCommand($sql,$conn) 
$reader=$command.ExecuteReader() 

# Write out the result set structure 
for ($i=0;$i -lt $reader.FieldCount;$i++) { 
Write-Host $reader.GetName($i) $reader.GetDataTypeName($i) 
} 

# Write out the results 
while ($reader.read()) { 
$dtl_id=$reader.GetDecimal(0) 
$invoice_id=$reader.GetDecimal(1) 
$debtor=$reader.GetInt64(2) 
$premise=$reader.GetInt64(3) 
$license=$reader.GetString(4) 
$invoice_num=$reader.GetInt64(5) 
$deb_cred=$reader.GetString(6) 
$inv_ref=$reader.GetString(7) 
$rate=$reader.GetDecimal(8) 
$charge=$reader.GetDouble(9) 
$usage=$reader.GetInt64(10) 
$tax=$reader.GetDouble(11) 
$rate_code=$reader.GetString(12) 
$inv_date=$reader.GetDateTime(13) 
$missed=$reader.GetString(14) 
$change_date=$reader.GetDateTime(15) 
$dnp=$reader.GetString(16) 

Write-Host "$dtl_id $invoice_id $debtor $premise $license $invoice_num $deb_cred  $inv_ref $rate $charge $usage $tax $rate_code $inv_date $missed $change_date $dnp " 
} 

回答

1

当然,在后续的问题,你可以使用$reader.item('columnname')通过名称来获得指定列的值。

更idomatic的路要走是创建对象,然后将它们传输到格式表来做输出。

假设列名的变量名,这里只是一个辅助功能来读取读者对象:

function Get-OracleDbObject 
{ 
    param(
     [string]$Query, 
     [Oracle.DataAccess.Client.OracleConnection]$Connection 
    ) 

    $command = New-Object Oracle.DataAccess.Client.OracleCommand $Query, $Connection 
    $reader = $command.ExecuteReader() 

    while($reader.Read()) { 
     $props = @{} 
     for($i = 0; $i -lt $reader.FieldCount; $i+=1) { 
      $name = $reader.GetName($i) 
      $value = $reader.item($i) 
      $props.Add($name, $value) 
     } 
     $obj = new-object PSObject -Property $props 
     Write-Output $obj 
    } 

    $reader.Dispose() 
    $command.Dispose() 
} 

然后,你可能只是这样做写东西放到列:

$sql = "select * from legacydb.ebt_invoice_dtl where premnum = 397743" 
Get-OracleDbObject -Query $sql -Connection $conn | Format-Table * 
+0

谢谢! - 这些代码对我来说有点进步(我会在这方面进一步学习),但是我使用我的表结构来获得代码。我忘了问 - 我怎样才能动态输出列名?因为我需要获取许多表的所有列,当我查询时我不知道列名,并且会再次进行大量输入。我可以为这部分代码构建变量吗? “格式 - 表dtl_id,invoice_id,债务人,许可证,invoice_num,....”对不起,我应该更明确地问这个问题。再次感谢。 – ikask 2014-10-12 15:40:58

+0

@ikask您可以使用'Format-Table *'来打印出对象的所有属性。在这种情况下,只需要'Format-Table'(无参数)就可以工作,因为没有默认方式来显示这些自定义对象。我将其添加到答案中并稍微清理一下,希望现在可以更容易地使用它。 – 2014-10-12 17:52:18

+0

谢谢迈克z。格式表*做了这项工作。我会尝试修订并了解这两个代码。 – ikask 2014-10-14 02:16:30