繁体   English   中英

使用MVC4剃须刀从存储过程中获取多个输出

[英]Getting multiple output from stored procedure using mvc4 razor

我使用带有mvc4剃须刀的存储过程来获取两个值。 我已经使用下面的代码来获取用户ID和用户类型。 现在如何使它从存储过程中同时返回userid和usertype?

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包含全名,用户名,用户类型,密码和用户名列。

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

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

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语句更新到存储过程中以进行匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM