【问题标题】:Getting multiple output from stored procedure using mvc4 razor使用 mvc4 razor 从存储过程中获取多个输出
【发布时间】:2016-02-25 17:09:00
【问题描述】:

我正在使用带有 mvc4 razor 的存储过程来获取两个值。我使用下面的代码来获取用户 ID 和用户类型。现在如何让它从存储过程中返回用户 ID 和用户类型?

logintable.cs

public partial class Userlogintable
{
     public int UserID { get; set; }
     public string Usertypename { get; set; }
     public int Usertype { get; set; }
     public string FullName { get; set; }
     public string Username { get; set; }
     public string Password { get; set; }
 }

家庭控制器.cs

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(logintable u)
{
        loginEntitiesdb = new loginEntities();
        int a = db.splogindata(u.Username, u.Password).First().Value;
 //a returns only usertype
        return View(p);
}

存储过程:

ALTER PROCEDURE [dbo].[splogindata]
    @Username varchar(30),
    @Password varchar(30)
AS
    declare @Userroletype int
BEGIN
    SET NOCOUNT ON;

    SELECT 
        fullname, userid, usertype 
    FROM
        logintable 
    WHERE
        Username = @Username   
        AND Password = @Password
END

这里只返回我从存储过程中获得的用户类型。而 logintable 包含 fullname、userid、usertype、password 和 username 列。

如何从表中获取用户类型和用户 ID,以便将值存储在参数中并用于将其传递给其他函数。

【问题讨论】:

    标签: c# sql-server asp.net-mvc asp.net-mvc-4 razor


    【解决方案1】:

    创建一个模型来表示要从存储过程返回的数据:

    public class MyReturnModel
    {
        public int UserId { get; set; }
        public int UserType { get; set; }
    }
    

    然后调用您的存储过程并使用ObjectContext.Translate 将结果映射到您的模型:

    public MyReturnModel DoLogin(logintable u)
    {
       using (var db = new MyContext())
       {
           var cmd = db.Database.Connection.CreateCommand();
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.CommandText = "splogindata";
    
          var u = cmd.CreateParameter();
          u.DbType = DbType.String;
          u.ParameterName = "@Username";
          u.Value = u.Username;
          cmd.Parameters.Add(u);
    
          var p = cmd.CreateParameter();
          p.DbType = DbType.String;
          p.ParameterName = "@Password";
          p.Value = u.Username;
          cmd.Parameters.Add(p);
    
    
          db.Database.Connection.Open();
          var reader = cmd.ExecuteReader();
          //  return list as ObjectList
          var results = ((IObjectContextAdapter) db).ObjectContext.Translate<MyReturnModel>(reader);
          //  cast to entity
          var returnModel = (from s in results select s).FirstOrDefault();
    
          db.Database.Connection.Close();
       }
    
       return returnModel;
    }
    

    这是一个简化的示例,实际上,您可以尝试...抓住对Open 的调用,然后关闭将在finally 块中。

    这种方法可用于返回多个记录集(使用 ToList() 而不是 FirstOrDefault),并且对于返回多个结果集也非常有用,否则需要多次数据库调用。

    更新

    要返回登录表中的所有列,您需要在“映射”模型中添加额外的属性:

    public string Usertypename { get; set; }
    public string FullName { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    

    显然你会更新 SELECT 语句到存储过程来匹配。

    【讨论】:

    • 我可以使用 select * from table_name 之类的查询从 sp 返回一组值,以便可以访问所需的值
    • 可以,只要将模型更改为包含所有列即可。此外,您应该将查询写为SELECT fullname, userid, usertype, password, username... etc,因为如果表被更改,select * 会导致查询失败。
    • 我已经添加了所有列的模型并将查询更改为在 sp 中选择现在我如何从控制器中的 sp 检索全名、用户 ID、用户类型。
    • 在这里,因为我正在使用实体框架工作,这些列将在连接到模型后添加到我的模型中,所以我如何访问控制器中的值
    • 您调用DoLogin() 方法。看返回类型。
    猜你喜欢
    • 2018-03-24
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2011-07-11
    相关资源
    最近更新 更多