Powershell, DataTable, ExecuteReader, ноль строк, возвращаемых запросом - PullRequest
0 голосов
/ 25 апреля 2018

Я использую следующую функцию PowerShell, чтобы выполнить произвольный запрос SQL к экземпляру SQL Server, а затем вернуть все имеющиеся там данные:

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 записей
  • a [DataRow] объект для отдельной записи
  • Коллекция объектов [DataRow] для более чем 1 записи

Итак, вопрос: как убедиться, чтовозвращаемый объект всегда имеет тип «System.Data.DataTable»?

Или, по крайней мере, как убедиться, что информация, связанная со столбцами (имена, типы, порядок) всегда доступна в функциирезультаты, независимо от количества строк, возвращаемых запросом?

Любые подсказки?

1 Ответ

0 голосов
/ 25 апреля 2018

Это распространенная ошибка при возврате коллекции из функции PowerShell. В качестве обходного пути добавьте запятую перед возвращаемым значением:

return(,$resTable)

Если по запросу не возвращаются строки, DataTable будет содержать исходную схему запроса, но с нулевыми строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...