【问题标题】:Powershell, DataTable, ExecuteReader, zero rows returned by a queryPowershell、DataTable、ExecuteReader、查询返回的零行
【发布时间】:2021-05-12 18:17:37
【问题描述】:

我使用以下 PowerShell 函数对 SQL Server 实例运行任意 SQL 查询,然后返回那里的任何数据:

Function ExecSQLReader([string] $sqlText) {
    $cn = New-Object System.Data.SqlClient.SqlConnection
    $cn.ConnectionString = "Data Source={0};Initial Catalog={1};Integrated Security=SSPI;" -f $fc.server,$fc.database
    $cn.Open()
    $cmd = $cn.CreateCommand()
    $cmd.CommandText = $sqlText
    $cmd.CommandTimeout = 60
    $resTable = New-Object("System.Data.DataTable")
    try {
        $result = $cmd.ExecuteReader()
        $resTable.Load($result)
        $result.Close()
        $cn.Close()
    } catch {
        "=======ERROR in ExecSQLReader========" | DoLog
        "Message: {0}" -f $_.Exception.Message | DoLog
        "SQL: {0}" -f $sqlText | DoLog
       "=======/ERROR in ExecSQLReader=======" | DoLog
    }
    return($resTable)
}

当有查询返回数据时,该函数可以正常工作。

但是,当查询没有返回数据时,该函数不会返回任何与列相关的信息。

即使没有数据行,我也需要知道列名/类型/顺序等。

我可以看到返回的值根据结果记录数不同(这使事情变得更加复杂):

  • 0 条记录的空结果
  • 单个记录的 [DataRow] 对象
  • 多于 1 条记录的 [DataRow] 对象集合

那么,问题来了:如何确保返回的对象始终是“System.Data.DataTable”类型?

或者,至少,无论查询返回的行数如何,如何确保与列相关的信息(名称、类型、顺序)始终在函数结果中可用?

有什么提示吗?

【问题讨论】:

    标签: sql-server function powershell datatable


    【解决方案1】:

    这是从 PowerShell 函数返回集合时的常见问题。作为一种解决方法,在返回值之前添加一个逗号:

    return(,$resTable)
    

    如果查询未返回任何行,则 DataTable 将包含源查询架构,但行数为零。

    【讨论】:

    • 有效!现在我有一个不同的问题:如果输入行集为空,我将生成的 DataObject 传递给 Export-Csv,显然 Export-Csv 不会导出任何内容(甚至不是列名)。但是对于这个,我有一个解决方法(我知道列名!)所以我们现在都处于绿色状态。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多