我正在寻找一种方法来在控制器中的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
此时代码中没有错误,它会编译,但是当它被执行时,它不会运行存储过程。
任何帮助将不胜感激。
答案 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)
所以你先说代码,我假设你正在使用实体框架:
答案 2 :(得分:0)
您应该尝试使用Entity Framework,但如果您正在努力使用它,那么至少要创建一些SOC(关注点分离)并将数据库ADO.NET调用放在控制器之外。您希望将SKINNY控制器连接到您的数据库。
理想情况下,图层......在您的解决方案中创建更多项目并拥有YourProject.Data等。 尝试创建存储库模式...尝试使用IOC容器。
有些概念可能只是你尚未准备好的事情。现在你肯定可以使用web.config连接字符串并连接你的控制器来查询/提取数据,但请不要将数据库代码留在控制器方法中。