SqlClient.ExecuteNonQuery не возвращает количество строк - PullRequest
0 голосов
/ 04 июля 2018

Я уже давно занимаюсь этим. У меня есть простая функция PowerShell, которая принимает открытое соединение с SQL Server и строку, содержащую команду SQL, и запускает ее на сервере. Функция должна возвращать целочисленное значение, представляющее количество строк, которые были обновлены. Однако вместо этого он выводит информацию о методе.

Код:

function Invoke-MSSQLNonQuery () {
    param (
        [System.Data.SqlClient.SqlConnection]$Connection,
        [string]$Command
    )

    # Create the SQL Command Ojbect
    $SQLCommand = New-Object System.Data.SqlClient.SqlCommand

    # Set the Command Text and Connection for the Command
    $SQLCommand.CommandText=$Command
    $SQLCommand.Connection=$Connection

    # Run command and return the rows affected
    [int]($SQLCommand.ExecuteNonQuery | Out-String)
}

Однако при выполнении я получаю следующую ошибку:

Cannot convert value "
OverloadDefinitions
-------------------
int ExecuteNonQuery()
int IDbCommand.ExecuteNonQuery()

" to type "System.Int32". Error: "Input string was not in a correct format."
At C:\_Local\playground\Mason\UpdateFromInventory.ps1:153 char:5
+     [int]($SQLCommand.ExecuteNonQuery | Out-String)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastFromStringToInteger

Я знаю, что ExecuteNonQuery при передаче по каналу Out-String выводит таблицу с определениями перегрузки:

OverloadDefinitions
------------------- 
int ExecuteNonQuery() 
int IDbCommand.ExecuteNonQuery()

Я также пытался ни к чему не привязывать, что привело к аналогичному результату без заголовка таблицы.

Редактировать: Кроме того, я должен отметить, что я на 95% уверен, что команды SQL выполняются успешно. Я точно знаю, что эта функция уже работала, даже возвращая правильный вывод. Однако долгое время этого не происходило.

Мои вопросы:

  1. Почему?
  2. Как я могу получить вывод количества затронутых строк вместо этого?

1 Ответ

0 голосов
/ 04 июля 2018

Вы пытаетесь вызвать метод без скобок. При этом вместо фактического вызова метода оператор отобразит список перегрузок (см., Например, здесь ), которые нельзя преобразовать в целое число, даже если вы сначала преобразуете его в строку.

Изменение

[int]($SQLCommand.ExecuteNonQuery | Out-String)

в

[int]$SQLCommand.ExecuteNonQuery()

и код должен делать то, что вы хотите.

...