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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:04:58