如何在MVC / EF / LINQ中执行存储过程并获得返回结果

时间:2013-10-02 17:23:08

标签: c# asp.net-mvc linq sql-server-2008 entity-framework

是否有人可以指导我如何在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 个答案:

答案 0 :(得分:9)

你的问题是这样的:你从存储过程返回值(使用RETURN @paramter2),但你的.NET代码试图读取结果集;通过在存储过程

中使用SELECT .....语句“返回”的东西

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

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

     SELECT @parameter2 

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

RETURN语句只能用于状态代码,它只能返回INT个值。如果您想使用它,则必须使用SqlParameter

为存储过程定义Direction.ReturnValue

答案 1 :(得分:4)

查看此官方文档,了解如何将Stored Procedure映射到您的上下文:

Stored Procedures in the Entity Framework

映射完成后,您就可以通过这种方式调用Stored Procedure

var val = _context.StoredProcedure2();

答案 2 :(得分:2)

一种选择就是这样做:

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

答案 3 :(得分:0)

您可以使用此库: https://github.com/mrmmins/C-StoreProcedureModelBinding

以List的形式返回值,您只需要创建一个包含名称和值类型的简单类,如:

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等。