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);
        }

    }

最後のポイントは、SqlQueryの代わりにSqlCommandを使用することです。必要に応じて、上部に他のパラメータを追加できます。必要なのは1つだけです。ストアドプロシージャはSQLServer2008 Expressで記述されており、Webページで実行しているのはそれを実行することだけです。

于 2012-09-20T20:09:55.200 に答える
0

つまり、最初にコードを言うと、EntityFrameworkを使用していると思います。

Entity Framework Code Firstはストアドプロシージャをサポートしていますか?

于 2012-09-14T17:25:43.877 に答える
0

Entity Frameworkの使用を試してみてください。ただし、問題が発生している場合は、少なくともSOC(関心の分離)を作成し、データベースのADO.NET呼び出しをコントローラーの外部に配置してください。データベースに接続されていないSKINNYコントローラーが必要です。

理想的には、レイヤー...ソリューションでさらにプロジェクトを作成し、YourProject.Dataなどを使用します。リポジトリパターンを作成してみてください...IOCコンテナを使用してみてください。

いくつかの概念は、まだ準備ができていないものかもしれません。今のところ、確かにweb.config接続文字列を使用し、コントローラーを接続して/ pullデータをクエリすることはできますが、そのデータベースコードをコントローラーメソッドに流し込まないでください。

于 2012-09-14T20:04:39.813 に答える