Оракул Powershell - динамически назначать элемент объекта чтения

1

Я должен запросить много таблиц базы данных оракула, используя powershell. Есть ли способ динамически строить переменные, которые будут использоваться для членов объекта-читателя?

Я должен указать имена членов объекта-читателя, такие как GetInt64 (3), GetString (4) и т.д., Чтобы я мог получать значения для каждого столбца в таблице.

Поскольку я должен перечислить так много таблиц с разными именами столбцов, будет много работы, чтобы написать это.

Как я могу написать его, чтобы я мог использовать имена переменных вместо имен членов? thnx - это мой первый пост здесь, на этом веб-сайте.

Это часть приведенного ниже кода, на который ссылается мой вопрос.

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

Я получил этот пример из этой ссылки (я не был уверен, должен ли я опубликовать следующий вопрос в том же разделе: Обращение с нулями в 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 "
}
Теги:
sql-server
powershell

1 ответ

1
Лучший ответ

Конечно, вы можете использовать $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 *
  • 0
    Спасибо! - эти коды немного продвинуты для меня (я изучу это подробнее), но я получил код, работающий с использованием структуры моей таблицы. Я забыл спросить - как мне также выводить имена столбцов динамически? Потому что мне нужно получить все столбцы для многих таблиц, которые я не знаю имен столбцов при запросе и снова будет много печатать. Могу ли я построить переменные для этой части кода? "Format-Table dtl_id, invoice_id, должник, лицензия, invoice_num, ...." Извините, я должен был задать вопрос в более явной форме. еще раз спасибо.
  • 0
    @ikask Вы можете использовать Format-Table * чтобы распечатать все свойства объекта. В этом случае, просто Format-Table (без аргументов) также может работать, так как не существует способа отображения этих пользовательских объектов по умолчанию. Я добавил это к ответу и немного убрал, надеюсь, теперь его немного проще использовать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню