Как безопасно обновить базу данных с использованием синтаксиса powershell? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть сценарий PowerShell, который безопасно работает до момента обновления. Я подключаюсь к базе данных и могу читать из нее, однако у меня возникают проблемы с обновлением.

Вот копия полученного сообщения об ошибке: «Исключение вызывает« ExecuteNonQuery »с аргументом (ами)« 0 »:« Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым ». В C: \ xxx \ xxx \ ToolsController.ps1: 37 char: 5 + $ InnerCommand.ExecuteNonQuery () + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: InvalidOperationException "

К вашему сведению: я опубликовал это раньше, и это обновление к предыдущему вопросу. Любая помощь будет принята с благодарностью.

Я попытался прикрепить переменную в конце строки, т.е. '.. + $ varibale' также пытался @ "" @, и я получил тот же результат.

$Global:Server = "server"      
$Global:Database = "db"
$Global:u = "un"
$Global:p = "pw"
[string]$Query = "SELECT * FROM [dbo].[jobs] WHERE [Run] = 0"
try{
$ConnectionString = "server=$Server;Integrated Security=true;database=$Database;user id=$u;password=$p"
$Connection = New-Object System.Data.SqlClient.SqlConnection
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
}
catch{
    "Failed to connect SQL Server"     
}

$Command = $Connection.CreateCommand()
$InnerCommand = $Connection.CreateCommand()
$Command.CommandText = $Query
$jobs = $Command.ExecuteReader()

    while ($jobs.Read()){

        switch($jobs["Script"]){                
            15
            {
                $traverse = $jobs["Frequency"] - 1
                While ($traverse -ge 0) {
                    c:\xx\xx\batch $jobs["Date"]
                    $traverse--
                }

                "Updating Database...."
                $Query2 = "UPDATE [dbo].jobs SET [Run] = 1 WHERE [ID] = $jobs['ID']" <------Error here.
                $InnerCommand.CommandText = $Query2
                $InnerCommand.ExecuteNonQuery()
                "Updating Completed!"
            }
        }
    }
$Connection.Close()
$Connection.Dispose()
Write-Host "Connection Closed"

1 Ответ

1 голос
/ 02 июля 2019

Добавить MultipleActiveResultSets=True к строке подключения. Это позволит чередовать UPDATE операторов при чтении из считывателя данных.

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