You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell 5.1使用Oracle Data Provider for .NET查询Oracle数据库无法获取表格格式结果的问题求助

解决PowerShell中Oracle查询结果的表格格式化问题

你的问题出在当前代码是分两次读取列数据,没有将每一行的多个字段组合成一个完整的对象——而PowerShell的表格输出依赖于对象集合,每个对象对应一行数据,属性对应列名。

下面是修改后的脚本,能直接输出和SQL Developer一致的表格格式:

# Path to ODAC.NET Installation
Add-Type -Path "C:\Oracle\odp.net\managed\common\Oracle.ManagedDataAccess.dll"
$reader = $false

# SQL DB Username, Password and DataSource Alias
$username = "demouser"
$password = "demouser"
$datasource = "localhost/XEPDB1"

$connectionstring = "User Id=$username;Password=$password;Data Source=$datasource"
$queryStatment = "SELECT * FROM TESTABLE"

try{
    $con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($connectionstring)
    $con.Open()
    $cmd = $con.CreateCommand()
    $cmd.CommandType = "Text"
    $cmd.CommandText = $queryStatment
    $reader = $cmd.ExecuteReader()

    # 获取所有列名,用于构建对象属性
    $columns = @()
    for ($i = 0; $i -lt $reader.FieldCount; $i++) {
        $columns += $reader.GetName($i)
    }

    # 遍历每一行,构建自定义对象
    $results = @()
    while ($reader.Read()) {
        $row = [PSCustomObject]@{}
        for ($i = 0; $i -lt $reader.FieldCount; $i++) {
            $columnName = $columns[$i]
            # 根据字段类型获取对应值(这里简化处理,常见类型都能覆盖)
            $value = switch ($reader.GetFieldType($i).Name) {
                "Decimal" { $reader.GetDecimal($i) }
                "String" { $reader.GetString($i) }
                # 可以根据需要添加更多类型处理,比如DateTime、Int32等
                default { $reader.GetValue($i) }
            }
            $row | Add-Member -MemberType NoteProperty -Name $columnName -Value $value
        }
        $results += $row
    }

    # 输出表格格式的结果
    $results | Format-Table -AutoSize
}
catch {
    Write-Error ("Database Exception: {0}`n{1}" -f $con.ConnectionString, $_.Exception.ToString())
}
finally{
    if ($con.State -eq 'Open') {
        $con.Close()
    }
    if ($reader) { $reader.Close() } # 记得关闭reader
}

关键修改点说明:

  1. 一次性读取reader:不再多次调用ExecuteReader,因为每个reader实例只能遍历一次结果集,重复调用会重置指针但完全没必要。
  2. 收集列名:通过FieldCount循环获取所有列的名称,作为后续对象的属性名,保证输出的表头和SQL Developer一致。
  3. 构建行对象:每读取一行数据,就创建一个PSCustomObject,将当前行的每个字段值映射到对应的列名属性,让PowerShell能识别这是一行完整的数据。
  4. 统一输出:把所有行对象收集到数组中,最后用Format-Table -AutoSize输出(直接输出数组也能得到表格,加Format-Table是为了自动调整列宽,优化显示效果)。

这样运行脚本后,你就能得到和SQL Developer类似的表格结果:

USER_ID USERNAME
------- --------
1001    user1
1002    user2

内容的提问来源于stack exchange,提问作者Alex You

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:42:33