web-dev-qa-db-ja.com

ストアドプロシージャを実行し、MVC / EF / LINQで戻り結果を取得する方法

ASP.NET MVC/EFでSQL Serverストアドプロシージャを実行する方法について誰かが私をガイドできますか
アプリケーションと結果を取り戻す?

SQL Serverストアドプロシージャ

 CREATE PROCEDURE dbo.StoredProcedure2 AS
     declare @parameter2 int
     SET @parameter2 = 4

     RETURN @parameter2 

MVCコード

 private readonly TestDatastoreContext _context = new TestDatastoreContext();

 public ViewResult Index(string id)
 {
        ViewData["EnvironmentId"] = id;

        using (_context)
        {
            _context.Database.Connection.Open();
            var command = _context.Database.Connection.CreateCommand();
            command.CommandText = "dbo.StoredProcedure2";
            command.CommandType = System.Data.CommandType.StoredProcedure;
            var test = (command.ExecuteScalar());
        }

        var bigView = new BigViewModel
        {
            VersionsModel = _context.Versions.ToList(),
            EnvironmentViewModel = _context.Environments.ToList(),
        };

        return View(model: bigView);
}
9
user845405

あなたの問題はこれです:(RETURN @paramter2を使用して)ストアドプロシージャから値を返していますが、.NETコードが結果セットを読み取ろうとしています。ストアドプロシージャ内でSELECT .....ステートメントを使用して「返される」もの

ストアドプロシージャを次のように変更します。

CREATE PROCEDURE dbo.StoredProcedure2 AS
     declare @parameter2 int
     SET @parameter2 = 4

     SELECT @parameter2 

その後、.NETコードは問題なく機能します。

RETURNステートメントはステータスコードにのみ使用する必要があり、INT値のみを返すことができます。これを使用する場合は、Direction.ReturnValueを使用して、ストアドプロシージャのSqlParameterを定義する必要があります。

9
marc_s

Stored Procedureをコンテキストにマップする方法については、この公式ドキュメントを確認してください:

Entity Frameworkのストアドプロシージャ

マッピング後、次のようにStored Procedureを呼び出すことができます。

var val = _context.StoredProcedure2();
4

1つのオプションは、単純にこれを行うことです。

MyReturnEntity ret = context.Database
         .SqlQuery<MyReturnEntity>("exec myStoredProc ?, ?", param1, parm2);
2

このライブラリを使用できます: https://github.com/mrmmins/C-StoreProcedureModelBinding

値をリストとして返します。次のような名前と値のタイプを持つ単純なクラスを作成するだけです。

_var productos = DataReaderT.ReadStoredProceadures<MyCustomModel>(myDbEntityInstance, "dbo.MySPName", _generic);
_

myCumtomModelクラスは次のようなものです。

_public int id {get; set;}
public int salary {get; set;}
public string name {get; set;}
public string school {get; set;}
_

そして一般的なような:

_List<Generic> _generic = = new List<Generic>
                          {
                              new Generic
                                  {
                                      Key = "@phase", Type = SqlDbType.Int, Value = "207"
                                  }
                          }
                      };
_

そして今、あなたのproductsproducts.First()products.Count()foreachなどのオプションを持っています。

0
MrMins