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

本文关键字:存储过程 获取 结果 返回 执行 LINQ MVC EF | 更新日期: 2023-09-27 18:33:41

谁能指导我如何在MVC/EF
ASP.NET 执行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);
}

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

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

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

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

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

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

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

实体框架中的存储过程

映射完成后,您将能够通过以下方式调用Stored Procedure

var val = _context.StoredProcedure2();

一种选择是简单地执行此操作:

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

您可以使用此库: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 等。