PowerShell读取SQL表时返回数据首项为行计数的原因咨询
问题:PowerShell读取SQL数据返回结果首项为行计数的原因及解决方法
问题场景
自定义PowerShell函数read_DB从SQL表读取数据,尝试将结果存入ArrayList,但输出的$all_tasks首项为表的行计数(数值3),后续才是具体表数据条目。
相关代码
function read_DB { Param( [Parameter(Mandatory = $true, Position = 0)][string]$query, [Parameter(Mandatory = $true, Position = 1)][System.Data.SqlClient.SqlConnection]$connection, ) $table = New-Object System.Data.DataTable $connection.Open() $command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) $dataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) $dataAdapter.Fill($table) $connection.Close() return $table } # Main $all_tasks = New-Object 'System.Collections.ArrayList' $query = "SELECT * from dbo.SPO_All where Status='Pending'" $all_tasks = read_DB -query $query -connection $database_connection
执行输出
PS C:\Users\Administrator\Documents> $all_tasks 3 ID : 4 Date : 9/23/2024 10:28:26 PM siteUrl : yaxxxx.com insertedBy : xxxx Status : Pending ID : 5 Date : 9/23/2024 10:28:47 PM siteUrl : axxx.com insertedBy : xxxx Status : Pending ID : 6 Date : 9/23/2024 10:29:08 PM siteUrl : goxxxx.com insertedBy : pxxx Status : Pending
原因分析
PowerShell函数的return并非仅返回关键词后的对象,而是会收集函数执行过程中所有未被抑制的输出。代码中$dataAdapter.Fill($table)方法会返回成功填充的行数(此处为3),这个数值没有被捕获,会被加入函数的输出流,和后续的$table一起返回。最终$all_tasks实际是一个包含3和DataTable的数组,输出时自然先显示行计数,再显示表数据。
解决方法
只需抑制Fill方法的返回值,避免其进入输出流,修改函数中的对应行即可:
修改后的完整函数
function read_DB { Param( [Parameter(Mandatory = $true, Position = 0)][string]$query, [Parameter(Mandatory = $true, Position = 1)][System.Data.SqlClient.SqlConnection]$connection ) $table = New-Object System.Data.DataTable $connection.Open() $command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) $dataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) $null = $dataAdapter.Fill($table) # 捕获Fill的返回值,阻止其进入输出流 $connection.Close() return $table }
额外说明
主代码中提前创建的ArrayList被函数返回值直接覆盖,若确实需要将结果存入ArrayList,可在赋值时转换:
$all_tasks = [System.Collections.ArrayList](read_DB -query $query -connection $database_connection)
内容的提问来源于stack exchange,提问作者Ashish Vats
相关产品推荐
相关产品推荐

