为什么我不能通过以下用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()
答案 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参数都不起作用。