VB.net:为什么我不能从自己的存储过程中获取返回值?

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

为什么我不能通过下面用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 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)