SqlClient.ExecuteNonQuery不返回行数

时间:2018-07-03 22:01:29

标签: powershell return-type sqlclient

我已经处理了一段时间了。我有一个简单的PowerShell函数,该函数需要与SQL Server的打开连接以及包含SQL命令的String并在服务器上运行它。该函数应返回一个整数值,表示已更新的行数。但是,它将输出有关该方法的信息。

代码:

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 :(得分:6)

您正在尝试调用不带括号的方法。这样做时,该语句将显示一个重载列表(例如,参见here),而不是实际调用该方法,即使您先将其转换为字符串,也无法将其转换为整数。

更改

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

进入

[int]$SQLCommand.ExecuteNonQuery()

并且代码应该执行您想要的操作。