1

我正在寻找一种在控制器的 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

结尾

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

任何帮助,将不胜感激。

4

3 回答 3

1

以下是我发现和工作的内容。这适用于 MVC3 C# 代码优先方法。

        [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 编写的,我在网页中唯一要做的就是执行它。

于 2012-09-20T20:09:55.200 回答
0

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

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

有些概念可能只是你还没有准备好的东西。现在你当然可以使用 web.config 连接字符串并连接你的控制器来查询 /pull 数据,但请不要让数据库代码渗入你的控制器方法。

于 2012-09-14T20:04:39.813 回答
0

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

Entity Framework Code First 是否支持存储过程?

于 2012-09-14T17:25:43.877 回答