9

谁能指导我如何在 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);
}
4

4 回答 4

10

您的问题是:您正在从存储过程中返回值(使用RETURN @paramter2),但您的 .NET 代码正在尝试读取结果集;通过在存储过程中使用SELECT .....语句“返回”的东西

因此,将您的存储过程更改为:

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

     SELECT @parameter2 

然后您的 .NET 代码应该可以正常工作。

RETURN语句应仅用于状态代码,并且只能返回INT值。如果你想使用它,你必须SqlParameter为你的存储过程定义一个Direction.ReturnValue

于 2013-10-02T18:11:13.057 回答
4

查看有关如何将 映射Stored Procedure到您的上下文的官方文档:

实体框架中的存储过程

映射后,您将能够以Stored Procedure这种方式调用:

var val = _context.StoredProcedure2();
于 2013-10-02T17:32:50.620 回答
2

一种选择是简单地这样做:

MyReturnEntity ret = context.Database
         .SqlQuery<MyReturnEntity>("exec myStoredProc ?, ?", param1, parm2);
于 2013-10-02T17:57:18.970 回答
0

你可以使用这个库: 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"
                                  }
                          }
                      };

现在,您products可以选择:products.First()products.Count()foreach

于 2015-03-30T16:23:07.157 回答