我正在尝试使用context.Database
来执行插入记录并返回标识的存储过程。我知道我的proc工作,使用输出参数,选择或返回,但我无法让ExecuteSqlCommand
或SqlQuery<int>
返回身份。
使用带有return的存储过程
INSERT INTO TableA (FieldA, FieldB)
RETURN SCOPE_IDENTITY
我看到SSMS的返回值为1010966
DECLARE @return_value int
EXEC @return_value = spInsertRecord
SELECT 'Return Value' = @return_value
但我在我的应用程序中所做的一切都没有返回有效值。
Int64 result = context.Database.ExecuteSqlCommand
总是返回3,并且在使用SqlQuery<int>
时我得到一个引用Decimal的转换错误。
我尝试使用输出参数,但无法让代码正确执行,因此专注于使用SELECT SCOPE_IDENTITY
或RETURN SCOPE_IDENTITY
如果没有创建模型来替换存储过程中包含的逻辑,我可以使用任何和所有建议来返回存储过程和应用程序级别的值。
答案 0 :(得分:1)
以下是如何使其发挥作用的方法。在这个例子中,我的EntityManager只是一个继承自DBContext的类。
测试表:
CREATE TABLE [dbo].[TableA](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FieldA] [nvarchar](50) NULL,
[FieldB] [nvarchar](50) NULL
) ON [PRIMARY]
存储过程:
CREATE PROC spInsertRecord
@FieldA NVARCHAR(50),
@FieldB NVARCHAR(50)
AS
INSERT TableA
(FieldA, FieldB)
VALUES
(@FieldA, @FieldB)
SELECT CAST(@@IDENTITY AS INT)
调用代码(VB.NET)
Public Shared Function AddRecord(FieldA As String, FieldB As String) As Integer
Try
Using EM As New EntityManager
Return EM.Database.SqlQuery(Of Integer)(
"EXEC spInsertRecord @FieldA, @FieldB",
New SqlParameter("FieldA", FieldA),
New SqlParameter("FieldB", FieldB)).SingleOrDefault
End Using
Catch ex As Exception
Throw New ApplicationException("An error occurred while executing AddRecord", ex)
End Try
End Function
消费代码:
Return AddRecord("Tom", "Halladay")
我的结果是递增的返回值。希望这会有所帮助。