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 }
关键修改点说明:
- 一次性读取reader:不再多次调用
ExecuteReader,因为每个reader实例只能遍历一次结果集,重复调用会重置指针但完全没必要。 - 收集列名:通过
FieldCount循环获取所有列的名称,作为后续对象的属性名,保证输出的表头和SQL Developer一致。 - 构建行对象:每读取一行数据,就创建一个
PSCustomObject,将当前行的每个字段值映射到对应的列名属性,让PowerShell能识别这是一行完整的数据。 - 统一输出:把所有行对象收集到数组中,最后用
Format-Table -AutoSize输出(直接输出数组也能得到表格,加Format-Table是为了自动调整列宽,优化显示效果)。
这样运行脚本后,你就能得到和SQL Developer类似的表格结果:
USER_ID USERNAME ------- -------- 1001 user1 1002 user2
内容的提问来源于stack exchange,提问作者Alex You
相关产品推荐
相关产品推荐

