在尝试解决这个问题几个小时后,我开始认为没有你的帮助我无法解决这个问题。情况:
我在 SQL Server Management Studio 中的存储过程(基本上):
SET NOCOUNT ON;
DELETE myTable
... -- Complex join query that deletes duplicates
RETURN @@ROWCOUNT -- The number of rows affected
此过程运行良好,如果我在 SSMS 中运行它,则会运行以下查询:
USE myDb
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[StoredProcedure]
@var1 = N'asd',
@var2 = N'fgh',
@var3 = N'jkl'
SELECT 'Return Value' = @return_value
GO
结果显示为 1 行,名称为 Return Value
,值 8700
(这是正确,它是被执行的行数)由查询删除)。
我的问题始于我的 C#/NHibernate 代码。在我的 NHibernate 映射中:
<sql-query name="MyStoredProcedureName">
exec dbo.StoredProcedure @var1=:var1, @var2=:var2, @var3=:var3
</sql-query>
在我调用存储过程的方法中:
var deletedEntities = session.GetNamedQuery("MyStoredProcedureName")
.SetString("var1", "asd")
.SetString("var2", "fgh")
.SetString("var3", "jkl")
.ExecuteUpdate();
这会导致deletedEntities = -1
。我希望它是 deletedEntities = 8700
。
我想指出,以下did返回了受影响的行数:
var deletedEntities = session.CreateQuery("DELETE Class c WHERE c.var1 = :var1 AND c.var2 = :var2 AND c.var3 = :var3")
.SetString("var1", var1)
.SetString("var2", var2)
.SetString("var3", var3)
.ExecuteUpdate();
其中Class
是属于NHibernate映射的类。
所以,总结一下:
- 在简单的
session.CreateQuery
上执行Update 可返回受影响的行数(良好) - 复杂
session.GetNamedQuery
上的 ExecuteUpdate 返回-1
(BAD) - 当我在 SSMS 中执行这个复杂的存储过程时,它会返回所需的
8700
(良好)
有人知道如何修复 2 吗?
最佳答案
使用http://csharptechies.blogspot.co.uk/2013/04/how-to-get-return-value-from-stored.html我的代码开始工作了。在此过程中,将 RETURN @@ROWCOUNT
替换为 SELECT @@ROWCOUNT
在 C# 代码中,我将 .ExecuteUpdate()
替换为 .UniqueResult()
。 UniqueResult 返回一个对象,其中包含 @@ROWCOUNT
值(需要按照上面的链接所述转换为 int)。
所以解决方案是一个组合(我想使用映射):
- 使用
SELECT
而不是RETURN
- 使用 .
UniqueResult()
代替.ExecuteUpdate()
编辑:我遇到了另一个问题,每当有大量记录需要删除时,查询就会超时。我在其他问题的帮助下解决了这个问题,例如SQL Server: Effects of using 'WITH RECOMPILE' in proc definition? 。
- 在大型表的复杂查询中使用
WITH RECOMPILE
(我的查询涉及左外连接
、min(id)
和group by
的情况下,受影响的记录数通常约为 20,000 条,但最多可达 100,000 条以上(我的表中有超过 350,000,000 条记录)以避免超时。
关于c# - 从 NHibernate 调用存储过程并检索 @@ROWCOUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36426587/