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 "
}
当然,您可以使用$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 *