使用ExecuteNonQuery

时间:2018-10-04 16:04:17

标签: sql-server vb.net stored-procedures ado.net

我的应用程序中有一些通用代码可用于调用非查询命令,例如插入:

DBComm.CommandText = SQL
DBComm.Connection = Cnn
Ans = DBComm.ExecuteNonQuery

我正在使用它来调用一个需要两个字符串并返回int的SP:

Dim SQL As String = "EXEC Import_Validation " & Code & "," & User
Return DbS.Execute(SQL)

这很好用,但返回值不是SP的值(它是某种作业ID吗?)。所以我做了一点修改:

Param = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)
Param.Direction = ParameterDirection.ReturnValue
DBComm.Parameters.Add(Param)
DBComm.CommandText = SQL
DBComm.Connection = Cnn
DBComm.ExecuteNonQuery

这会运行,但对于RETURN_VALUE始终返回0。我怀疑,这是因为我没有以下行:

DBComm.CommandType = CommandType.StoredProcedure

这种怀疑正确吗?

但是,如果我添加此行,则SQL不再起作用,并显示Could not find stored procedure "Import_Validation '1234', 'maury'。我认为这是因为它认为我传入的字符串只是名称,并且被参数混淆了。我可以将这些参数添加为DBComm上的输入参数,但随后该方法将特定于特定的SP。

那么有什么方法可以使用我构造的SQL调用SP并仍然返回参数吗?

2 个答案:

答案 0 :(得分:1)

我无法猜测或解释为什么执行存储过程时会遇到麻烦,因为您没有共享完整的代码(存在问题的代码的完整部分)。但是,通常来说,当您使用ExecuteNonQuery()时,应该使用有效的T-SQL。默认情况下,commandType为Text。因此,如果需要执行存储过程,则需要在执行查询之前将命令类型更改为StoredProcedure。所以,我想说您的猜测在这一行是正确的:

DBComm.CommandType = CommandType.StoredProcedure

此外,在您的代码中,您声明了一个@RETURN_VALUE参数,但是我看不到任何调用其值的内容!那么,也许这就是问题所在?

无论如何,请检查:

Using connection As New SqlConnection(ConnectionString)
    command As New SqlCommand("dbo.Import_Validation", connection)
    command.CommandType = CommandType.StoredProcedure

    command.Parameters.Add("@Code", SqlDbType.VarChar, 250)
    command.Parameters.Add("@User", SqlDbType.VarChar, 250)
    command.Parameters.Add("@RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue

    command.Parameters("@Code").Value = Code
    command.Parameters("@User").Value = User

    connection.Open()
    command.ExecuteNonQuery()

    'IF returned value is more than one row, then use reader instead
    Dim return_value As Integer = Convert.ToInt32(command.Parameters("@RETURN_VALUE").Value)

    connection.Close()
End Using 

答案 1 :(得分:1)

如果您只是返回一个整数,我已经使用过:

Param.value=cmd.ExecuteScalar()