VB.net: Почему я НЕ могу получить возвращаемое значение из моей собственной хранимой процедуры? - PullRequest
3 голосов
/ 22 января 2011

Почему я НЕ могу получить возвращаемое значение (Scope_Identity), выполнив собственную хранимую процедуру (SQL Server 2008) с помощью приведенного ниже кода, написанного на VB.NET 2008? 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 ]

2 голосов
/ 22 января 2011

Либо измените свой код VB, чтобы проявить интерес к возвращаемому значению (например: Command.ExecuteScalar() вместо Command.ExecuteNonQuery() и используйте 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 голос
/ 21 февраля 2011

Я думаю, что у вас ошибка в вашем коде вместо существующей строки

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

Вы должны использовать:

ScopeIdentity = System.Convert.ToInt32(ReturnValue.Value)
0 голосов
/ 15 апреля 2013

Я понимаю, что это старый вопрос, но у меня была та же проблема, и, кажется, я нашел правильный ответ.

Это связано с SqlCommandBuilder.DeriveParameters.

DeriveParameters автоматически добавляет параметр ReturnValue и присваивает ему имя "@RETURN_VALUE", поэтому просто обратитесь к нему, и вы получите его значение.

Вы также можете пропустить DeriveParameters и добавить все параметры самостоятельнонапример, с AddWithValue или аналогичным, включая ваш параметр ReturnValue (с любым именем, которое вам нравится).

Но как выполнение DeriveParameters, так и добавление параметра ReturnValue самостоятельно не будут работать.

...