powershell oracle查询-动态分配读取器对象成员

本文关键字:对象 成员 读取 动态分配 oracle 查询 powershell | 更新日期: 2023-09-27 18:26:13

我必须使用powershell查询许多oracle数据库表。有没有一种方法可以动态构建用于读取器对象成员的变量?

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

由于我必须列举这么多不同列名的表,所以写这篇文章需要做很多工作。

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

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

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

我从这个链接中得到了这个例子(我不确定我是否应该在同一个帖子上发布一个后续问题。:处理powershell 中的null

# 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 "
}

powershell oracle查询-动态分配读取器对象成员

当然,您可以使用$reader.item('columnname')按名称获取指定列中的值。

一种更灵活的方法是创建对象,然后通过管道将它们发送到"格式化表"以进行输出。

假设列名是您的变量名,这里有一个从读取器读取对象的辅助函数:

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 *
相关文章: