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

时间:2011-01-22 08:21:32

标签: .net vb.net stored-procedures return-value

为什么我不能通过以下用VB.NET 2008编写的代码执行我自己的存储过程(SQL Server 2008)来获取返回值(Scope_Identity)? SP将新记录插入Table1,但我将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

我自己的简单存储过程体:

 insert into dbo.Table1(Name, Age) values(@Name, @Age)
 return SCOPE_IDENTITY() 

3 个答案:

答案 0 :(得分:2)

更改VB代码以对返回值感兴趣(例如:Command.ExecuteScalar()而不是Command.ExecuteNonQuery()并在proc结束时使用SELECT SCOPE_IDENTITY()或更改存储过程设置OUT参数例如:set @ReturnValue = SCOPE_IDENTITY()而不是return SCOPE_IDENTITY()

您的VB代码当前希望proc设置输出参数,但return SCOPE_IDENTITY()不设置参数。

在此处查看有关SCOPE_IDENTITY()的上下文:http://msdn.microsoft.com/en-us/library/ms190315.aspx

答案 1 :(得分:1)

我认为您的代码中存在错误而不是现有行

ScopeIdentity = System.Convert.ToInt32(ScopeIdentityParameter.Value)

您应该使用:

ScopeIdentity = System.Convert.ToInt32(ReturnValue.Value)

答案 2 :(得分:0)

我意识到这是一个老问题,但我遇到了同样的问题,似乎我找到了正确的答案。

它与SqlCommandBuilder.DeriveParameters有关。

DeriveParameters会自动添加returnValue参数并为其指定名称“@RETURN_VALUE”,因此只需参考该值,您就会得到它的值。

你也可以跳过DeriveParameters并自己添加所有参数,例如使用AddWithValue或类似参数,包括你的ReturnValue参数(你喜欢任何名字)。

但是执行DeriveParameters和自己添加ReturnValue参数都不起作用。