Powershell - 如何使用适用于 .NET 的 Oracle 数据提供程序将查询导出到 CSV 文件 (ODP.NET)

Powershell - How to export to CSV file a query with Oracle Data Provider for .NET (ODP.NET)

在 Powershell 中,我想将查询结果 ODP.NET 导出到 CSV 文件

这是我的代码:

$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($connectionString)
$connection.open()
$cmd  = New-Object Oracle.ManagedDataAccess.Client.OracleCommand -ArgumentList $query
$cmd.Connection = $connection
$reader = $cmd.ExecuteReader()

此代码使用正确的 $connectionString 和 $query 变量值。如果我添加此代码,我可以读取查询的正确结果:

    while ($reader.Read()) {

     $col1 = $reader["Col1"]
     $col2 = $reader["Col2"]
     $col3 = $reader["Col3"]
     #Write-Host $col1, $col2, $col3
    }

这 3 列是示例,在我的实际情况中还有更多。然后我想直接导出到CSV文件,像这样:

XXXXXXX | export-csv -Delimiter ";" -Path "E:\export.csv"

我该怎么做?预期结果是一个类似于此的 CSV 文件:

"4581";"6";26867;"191057";"BH02 - 26867 - ";"30/05/2019";"";"2040";1991,04;"2040";2,4;"00";"";348;"";"1";"1";"";"";"BRL";2040;"";1
"4581";"4";28313;"747990";"BH02 - 28313 - ";"30/05/2019";"";"140";137,13;"140";2,05;"00";"";459;"";"1";"1";"";"";"BRL";140;"";1
"4581";"1";28316;"881411";"BH02 - 28316 - ";"30/05/2019";"";"140";137,13;"140";2,05;"00";"";460;"";"1";"1";"";"";"BRL";140;"";1
"4581";"1";;"878676";"BH02 -  - 275650/PF19";"28/05/2019";"";"103";100,8885;"103";2,05;"00";"";305;"";"1";"1";"";"";"BRL";103;"";1
"4581";"6";28168;"006778";"BH02 - 28168 - 275714/PF19";"30/05/2019";"";"848";828,92;"848";2,25;"00";"";429;"";"1";"1";"";"";"BRL";848;"";1
"4581";"3";29080;"641559";"BH02 - 29080 - ";"30/05/2019";"";"3424,14";3338,5365;"3424,14";2,5;"00";"";488;"";"1";"1";"";"";"BRL";3424,14;"";1
"4581";"4";;"602483";"BH02 -  - 23443";"28/05/2019";"";"157";153,7815;"157";2,05;"00";"";329;"";"1";"1";"";"";"BRL";157;"";1

这个 Oracle 命令的原始输出是什么?

如果是列表,则使用 -Join 并使用 Csv cmdlet 导出以转换为 csv 文件。

这也表明您是新手或以前从未使用过 PowerShell,因为 csv 用例是家常便饭。没关系,但跳转到 YouTube、MSDN Channel9 并浏览有关 PowerShell、beginning/intermediate/advanced、PowerShell 和数据库、PowerShell 和 Csv 文件的视频,然后逐渐增加到 limit/avoid、误解、挫折、坏习惯、等等

做这样的事情应该很简单(当然不要在脚本中输入密码)...

Add-Type -Path 'C:\oracle\instantclient_10_2\odp.net\managed\common\Oracle.ManagedDataAccess.dll'

$username = "USERID"
$password = "Password"
$datasource = "HOST:PORT/Instance"

$connectionString = "User Id = $username;Password = $password;Data Source = $datasource"

$query = "SELECT DATA1, DATA2, DATA3, DATA4, DATA5, DATA6, DATA7, DATA8 
FROM TABLE WHERE NOT REGEXP_LIKE (EMAIL_ID, '@domain.com','i') order by DATA2"

$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection("$connectionString")
$connection.open()

$command = New-Object Oracle.ManagedDataAccess.Client.OracleCommand
$command.Connection = $connection
$command.CommandText = $query

$ds = New-Object system.Data.DataSet
$da = New-Object Oracle.ManagedDataAccess.Client.OracleDataAdapter($command)

[void]$da.fill($ds)

return $ds.Tables[0] | 
SELECT DATA1, DATA2, DATA3, DATA4, DATA5, DATA6, DATA7, DATA8 | 
Export-CSV "C:\test.csv" -NoTypeInformation

$connection.Close()