我的应用程序中有一些通用代码可用于调用非查询命令,例如插入:
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并仍然返回参数吗?
答案 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()