【发布时间】:2016-04-05 12:37:40
【问题描述】:
在尝试解决这个问题几个小时后,我开始认为没有你的帮助我无法解决这个问题。情况:
我在 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。
我想指出,以下确实返回了受影响的行数:
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 映射的类。
所以,总结一下:
- 在 SIMPLE
session.CreateQuery上执行更新会返回受影响的行数 (GOOD) - 在 COMPLEX
session.GetNamedQuery上执行更新返回-1(错误) - 当我在 SSMS 中执行此相同的复杂存储过程时,它会返回所需的
8700(好)
有人知道如何修复 2 吗?
【问题讨论】:
-
您的问题与这些问题非常相似,但对于 实体框架 中的所有情况,它们都会返回
-1,请在此处查看它们:stackoverflow.com/questions/32140774/… 此处:@987654322 @ -
谢谢您,现在就阅读。
-
@S.Akbari 我对他们创建的第一个变量 (db) 以及他们如何调用存储过程感到有些困惑。它与我在 NHibernate 中的称呼完全不同。此外,我看不到如何“将存储过程作为函数导入。右键单击实体模型的工作区,然后选择添加 -> 函数导入。” (这一定是最愚蠢的问题之一,但我的实体模型的工作区是什么?:S)。
-
按照第二个链接中的建议更改存储过程怎么样?
-
使用您提供的两个链接中的单词,我用谷歌搜索了更多内容,发现:csharptechies.blogspot.co.uk/2013/04/… 这实际上似乎有效。我将研究结合
GetNamedQuery(映射).ExecuteUpdate()组合而不是CreateSQLQuery和.UniqueResult组合的解决方案。
标签: c# sql-server stored-procedures nhibernate