如何在MVC3 C中调用存储过程#

时间:2012-09-14 17:22:49

标签: c# sql asp.net-mvc-3 entity-framework

我正在寻找一种方法来在控制器中的C#代码中调用我的存储过程。我已经拥有控制器中所需的一切。我在编辑的帖子上有ID,在提交时我需要做的是使用参数id调用存储过程。 在SQL中,您可以这样做:

 EXEC [dbo].[AddGlassCutting] @AuditScheduleID = 1192

进行测试。这在我的网站代码中不起作用。 数据库使用代码优先方法完成。

2012年9月14日1:33更新

从编辑帖子中添加了代码 - 这也是我需要它执行的地方:

        [HttpPost]
    public ActionResult Edit(int id, AuditScheduleEdit viewModel)
    {            
        if (ModelState.IsValid)
        {
            viewModel.PopulateCheckBoxsToSpacerType();
            _db.Entry(viewModel.AuditScheduleInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Audit", new {id});
        }
        else
        {
            return View(viewModel);
        }

    }

2012年9月18日更新

        [HttpPost]
    public ActionResult Edit(int id, AuditScheduleEdit viewModel)
    {            
        if (ModelState.IsValid)
        {
            var addGlassCutting = new SqlParameter("@AuditScheduleID", id);
            _db.Database.SqlQuery<QQAForm.ViewModels.AuditScheduleEdit.AddGlassCutting>
                ("AddGlassCutting @AuditScheduleID", addGlassCutting);
            viewModel.PopulateCheckBoxsToSpacerType();
            _db.Entry(viewModel.AuditScheduleInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Audit", new {id});
        }
        else
        {
            return View(viewModel);
        }

    }

这是我的存储过程:

ALTER PROCEDURE [dbo].[AddGlassCutting] 
-- Add the parameters for the stored procedure here
@AuditScheduleID int = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
/****** Script for adding Glass Cutting  ******/
INSERT INTO QQAEntities.dbo.MainAnswers (AuditScheduleID, MainQuestionID)
SELECT @AuditScheduleID, MainQuestionID
FROM QQAEntities.dbo.MainQuestions
WHERE ReferenceNo > 0

END

此时代码中没有错误,它会编译,但是当它被执行时,它不会运行存储过程。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

以下是我发现并运作的内容。这是针对MVC3 C#Code的第一种方法。

        [HttpPost]
    public ActionResult Edit(int id, AuditScheduleEdit viewModel)
    {            
        if (ModelState.IsValid)
        {
            var addGlassCutting = new SqlParameter("@AuditScheduleID", id);
            _db.Database.SqlCommand
            ("EXEC AddGlassCutting @AuditScheduleID", addGlassCutting);
            viewModel.PopulateCheckBoxsToSpacerType();
            _db.Entry(viewModel.AuditScheduleInstance).State = System.Data.EntityState.Modified;
            _db.SaveChanges();
            return RedirectToAction("Audit", new {id});
        }
        else
        {
            return View(viewModel);
        }

    }

最后的结果是使用SqlCommand而不是SqlQuery。如果需要,您可以在顶部添加其他参数。我只需要一个。存储过程是用SQL Server 2008 Express编写的,我在网页上做的唯一一件事就是执行它。

答案 1 :(得分:0)

所以你先说代码,我假设你正在使用实体框架:

Does Entity Framework Code First support stored procedures?

答案 2 :(得分:0)

您应该尝试使用Entity Framework,但如果您正在努力使用它,那么至少要创建一些SOC(关注点分离)并将数据库ADO.NET调用放在控制器之外。您希望将SKINNY控制器连接到您的数据库。

理想情况下,图层......在您的解决方案中创建更多项目并拥有YourProject.Data等。 尝试创建存储库模式...尝试使用IOC容器。

有些概念可能只是你尚未准备好的事情。现在你肯定可以使用web.config连接字符串并连接你的控制器来查询/提取数据,但请不要将数据库代码留在控制器方法中。