Почему я не могу получить значение из SQL запроса? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь получить результат запроса SQL к переменной в PowerShell. Соединение с базой данных, кажется, работает нормально, потому что на выходе я получаю сообщение «Online».

Можете ли вы сказать мне, что может быть не так прямо здесь?

Запрос работает нормально в SQL Студия управления сервером.

Param(
         [string] $Server= "WIN-EBQ95HA6M6V\SQLEXPRESS",
         [string] $Database = "myDB",
         [string] $SQLQuery= $("SELECT state_desc FROM sys.databases where name='myDB'"),
         [string] $SqlQueryResult
    )
    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Connection.ConnectionString = "server='$Server';database='$Database';trusted_connection=true;"
    $Connection.Open()

    $Command = New-Object System.Data.SQLClient.SQLCommand
    $Command.Connection = $Connection
    $Command.CommandText = $SQLQuery
    $Reader = $Command.ExecuteReader()

    while ($Reader.Read()) {
         $Reader.GetValue($QueryResult)
    }

    $Connection.Close()
    return $QueryResult

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я думаю, что вы ищете $QueryResult = $Reader.GetValue($SqlQueryResult)?

0 голосов
/ 29 апреля 2020

Вы присваиваете свой результат внутренней переменной $Reader, но затем пытаетесь вернуть $QueryResult в конце. В основном вы возвращаете неправильную переменную.

Кроме того, если вы хотите расширить свой SQL запрос в будущем, чтобы получить несколько столбцов или более одной строки, вам, вероятно, потребуется пересмотреть код для сборки и вернуть внутренний объект dataTable.

Вот как это можно сделать с помощью фрагмента модуля PowerShell ммс SQL :

$SqlReader = $SqlCommand.ExecuteReader()

$results = [System.Collections.ArrayList]::new()
$keepGoing = $true
while($keepGoing) {
    while($SqlReader.HasRows) {
        $SqlDataTable = New-Object -TypeName "System.Data.DataTable"
        $SqlDataTable.Load($SqlReader)
        $results.Add($SqlDataTable) | Out-Null
    }
    try{
        if(-not $SqlReader.NextResult()){
            $keepGoing = $false
        }
    }
    catch {
        $keepGoing = $false;
    }
}
$SqlReader.Close()
if($results.Count -eq 1){
    $results[0]
}
else{
    $results
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...