VB.net:为什么我不能从自己的存储过程中获取返回值?
为什么我不能通过下面用VB.NET 2008编写的代码执行自己的存储过程(SQL Server 2008)来获取返回值(Scope_Identity)?SP将新记录插入表1,但返回值为0 怎么了 以下是我的vb.net代码和我的SP:VB.net:为什么我不能从自己的存储过程中获取返回值?,.net,vb.net,stored-procedures,return-value,.net,Vb.net,Stored Procedures,Return Value,为什么我不能通过下面用VB.NET 2008编写的代码执行自己的存储过程(SQL Server 2008)来获取返回值(Scope_Identity)?SP将新记录插入表1,但返回值为0 怎么了 以下是我的vb.net代码和我的SP: Public Function Insert(ByVal Obj As entity, connectionString As String) As Integer Dim ScopeIdentity As Integer Dim Connecti
Public Function Insert(ByVal Obj As entity, connectionString As String) As Integer
Dim ScopeIdentity As Integer
Dim Connection As New SqlConnection(connectionString)
Using Command As New SqlCommand
With Command
.Connection = Connection
.CommandTimeout = 300
.CommandType = CommandType.StoredProcedure
.CommandText = "S_Test"
If .Connection.State <> ConnectionState.Open Then
.Connection.Open()
End If
SqlCommandBuilder.DeriveParameters(Command)
With .Parameters
.Item("@Name").Value = Obj.Name
.Item("@Age").Value = Obj.Age
End With
Dim ScopeIdentityParameter As New SqlParameter("ReturnValue", SqlDbType.Int)
ScopeIdentityParameter.Direction = ParameterDirection.ReturnValue
Command.Parameters.Add(ScopeIdentityParameter)
Command.ExecuteNonQuery()
ScopeIdentity = System.Convert.ToInt32(ScopeIdentityParameter.Value)
End With
End Using
Return ScopeIdentity
End Function
更改VB代码以对返回值感兴趣(例如:
Command.ExecuteScalar()
而不是Command.ExecuteNonQuery()
并在过程结束时使用SELECT SCOPE\u IDENTITY()
),或者更改存储过程以设置OUT参数,例如:set@ReturnValue=SCOPE\u IDENTITY()
而不是返回范围\u IDENTITY()
VB代码当前希望proc设置输出参数,但返回范围\u IDENTITY()
未设置参数
关于SCOPE_IDENTITY()的上下文,请参见此处:我认为您的代码中有一个错误,而不是现有的行
ScopeIdentity = System.Convert.ToInt32(ScopeIdentityParameter.Value)
你应使用:
ScopeIdentity = System.Convert.ToInt32(ReturnValue.Value)
我意识到这是一个老问题,但我也遇到了同样的问题,似乎我找到了正确的答案 它与SqlCommandBuilder.DeriveParameters有关 DeriveParameters会自动添加returnValue参数,并将其命名为“@RETURN_VALUE”,因此只需参考该参数即可获得其值 您还可以跳过DeriveParameters并自己添加所有参数,例如使用AddWithValue或类似工具,包括ReturnValue参数(使用您喜欢的任何名称)
但是执行DeriveParameters和自己添加ReturnValue参数都不起作用。“但是return SCOPE_IDENTITY()没有设置参数。”好的,谢谢您的注释。我知道OUT参数,但这是我第一次在SP中使用Return值。如何利用Return(如Return SCOPE_IDENTITY())并在vb.net中获取其值?我想我在写答案时误解了你的问题。我不知道为什么你的返回值没有从proc到代码。我怀疑这与应用默认返回值0和忽略隐式返回有关。表1的插入是否有效?如果不是,则返回值将设置为受影响的行数,而不是范围标识。
ScopeIdentity = System.Convert.ToInt32(ReturnValue.Value)