Powershell,DataTable,ExecuteReader,查询返回的零行

时间:2018-04-25 10:02:43

标签: sql-server function powershell datatable

我使用以下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]对象
  • 多个记录的[DataRow]对象集合

所以,问题是:如何确保返回的对象始终是" System.Data.DataTable"类型?

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

任何提示?

1 个答案:

答案 0 :(得分:2)

从PowerShell函数返回集合时,这是一个常见的问题。要解决此问题,请在返回值之前添加逗号:

 public void executeJavascript(String script) {
        ((JavascriptExecutor) driver).executeScript(script);
    }

如果查询没有返回任何行,则DataTable将包含源查询模式,但行数为零。