c# - 从 NHibernate 调用存储过程并检索 @@ROWCOUNT

标签 c# sql-server stored-procedures nhibernate

在尝试解决这个问题几个小时后,我开始认为没有你的帮助我无法解决这个问题。情况:

我在 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映射的类。

所以,总结一下:

  1. 在简单的 session.CreateQuery 上执行Update 可返回受影响的行数(良好)
  2. 复杂 session.GetNamedQuery 上的 ExecuteUpdate 返回 -1 (BAD)
  3. 当我在 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)。

所以解决方案是一个组合(我想使用映射):

  1. 使用 SELECT 而不是 RETURN
  2. 使用 .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/

    相关文章:

    c# - 如何绑定(bind)到 ComboBox 的 Selected Item 中的属性?

    javascript - 删除的 javascript 文件仍在运行

    sql-server - SSIS 中的 OData 源组件未连接

    c# - 如何为 HttpWebRequest 或 WebRequest C# 强制使用 ipv6 或 ipv4

    c# - Kotlin "apply"在 C# 中等效

    sql - 在导入到 SQL Server 之前自动删除 Excel 中的行

    sql - 在不更改排序规则的情况下更改列

    mysql - 如何在 DB2 中与其他 sql 一起运行脚本

    sql - 如何在 Visual Studio 中设置 SQL 数据库项目中的数据库连接字符串?

    mysql - 对表的所有列应用函数