我试图从数据库第一个MVC实体框架项目调用SQL Server中的存储过程,但返回值始终返回-1。
我已经尝试了很多不同的方法来解决这个问题,到目前为止还没有成功。我在下面列出了我认为的相关代码。如果需要更多代码,请告诉我。感谢任何可以提供帮助的人!
这只是我的测试代码,看它是否正常工作。
public ActionResult Index()
{
Cust_Entities cse = new Cust_Entities();
if (cse.DoesCustomerNumberExist("1") == 1)
{
return RedirectToAction("Index", "Home");
}
else
{
return RedirectToAction("About", "Home");
}
}
public virtual int DoesCustomerNumberExist(string customer_Number)
{
var customer_NumberParameter = customer_Number != null ?
new ObjectParameter("Customer_Number", customer_Number) :
new ObjectParameter("Customer_Number", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("DoesCustomerNumberExist", customer_NumberParameter);
}
SQL Server存储过程代码:
ALTER PROCEDURE [dbo].[DoesCustomerNumberExist]
@Customer_Number VARCHAR(20)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Exists INT
IF EXISTS(SELECT Customer_Number
FROM business_Final.dbo.AR_Customer
WHERE Customer_Number = @Customer_Number)
BEGIN
SET @Exists = '1'
END
ELSE
BEGIN
SET @Exists = '0'
END
RETURN @Exists
END
答案 0 :(得分:3)
您正在使用ExecuteFunction
的无类型版本。根据文件:
执行数据中定义的存储过程或函数 来源并在概念模型中表达;丢弃任何结果 从函数返回;并返回受影响的行数 执行。
如果未进行任何修改,则通常为-1。
以下是ExecuteFunction
的不同形式的文档:https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.executefunction(v=vs.110).aspx
答案 1 :(得分:2)
非泛型ExecuteFunction
的返回值是受影响的行数,而不是存储过程的返回值。换句话说,它只适用于更新,删除等内容,而不是选择。
要返回数据,您必须使用通用版本,即ExecuteFunction<TElement>
,其中TElement
是您的返回类型。这是因为该方法需要知道如何绑定从SQL Server返回的值。