【问题标题】:How to use value returned from method whose returning datatable?如何使用从返回数据表的方法返回的值?
【发布时间】:2020-06-26 10:42:11
【问题描述】:

如果数据库中存在特定的 emailID,则此方法返回 userId。

public DataTable isEmailExist(string emailID)
{
    DataTable dt = new DataTable();
    string connstr = ConfigurationManager.ConnectionStrings["myConString"].ToString();
    using (SqlConnection con = new SqlConnection(connstr))
    {
        using (SqlCommand cmd = new SqlCommand("validateEmail", con))
        {
            using (SqlDataAdapter da = new SqlDataAdapter())
            {
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue(@"p_emailid", SqlDbType.VarChar).Value = emailID;
                da.SelectCommand = cmd;
                con.Open();
                da.Fill(dt);

            }
        }
    }
    return dt;
}
    

这是我重置密码的 mvc 方法,它将调用将新密码插入数据库的方法

[HttpPost]
public JsonResult ResetPassword(ResetPasswordModel reset)
{
    AjaxResponse ajaxResponse = new AjaxResponse()
    {
        StatusCode = "Error"
    };
    if (reset != null)
    {
        ajaxResponse.StatusCode = "OK";
        PasswordReset(reset);

    }
    else
    {
        ajaxResponse.Message = "Reset Password Failed";
    }

    return Json(ajaxResponse, JsonRequestBehavior.AllowGet);
}

这个方法是向数据库发送数据

private ResetPasswordModel PasswordReset(ResetPasswordModel reset)
{
    reset.Password = Encrypt(reset.Password);
    reset.ConfirmPassword = Encrypt(reset.ConfirmPassword);
    if (ModelState.IsValid)
    {
        string connstr = ConfigurationManager.ConnectionStrings["myConString"].ToString();

        using (SqlConnection con = new SqlConnection(connstr))
        {
            using (SqlCommand cmd = new SqlCommand("Reset_Password", con))
            {
                using (SqlDataAdapter da = new SqlDataAdapter())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue(@"p_resetUserID", SqlDbType.VarChar).Value = isUserIdExist;
                    cmd.Parameters.AddWithValue(@"p_newpassword", SqlDbType.VarChar).Value = reset.Password;
                    cmd.Parameters.AddWithValue(@"p_confirmPassword", SqlDbType.VarChar).Value = reset.ConfirmPassword;
                    da.SelectCommand = cmd;
                    con.Open();
                }
            }
        }
    }
    return reset;
}

**1。 isEmailExist 方法返回一个用户 ID,我想将该用户 ID 用于 PasswordReset 方法。

  1. 想使用 userId 作为存储过程方法的参数。

3.但是 isEmailExist 方法接受一个 email 参数,所以如何在 PasswordReset 方法中使用它。**

【问题讨论】:

  • 您的ResetPasswordModel 是否已有您正在寻找的电子邮件地址?
  • "isEmailExist 方法返回一个用户 ID,我想将该用户 ID 用于 PasswordReset 方法。" ...好的。但目前还不清楚你被困在哪里。当您尝试运行该方法时发生了什么?您的帖子描述了您的要求,但没有描述任何类型的问题。我们不明白为什么你坚持实施它。出了什么问题?流程的哪一部分你不明白?你需要执行方法并得到结果。
  • 如果它返回一个数据表,那么你需要在表中找到值(如果它是单个值,它很可能在数据表第一行的第一个单元格中(虽然因为你没有显示存储过程代码,我们实际上不知道它会真正返回什么)。
  • 不,这只是问题 isEmailexist 接受参数 emailId 并从数据库返回 userID 那么如何在没有 email 参数的 PasswordReset 方法中使用 isEmailExist。
  • 通常你会从 Session 中获取当前登录用户的 ID。使用 asp.net 时,这通常是通过 User.Identity 对象,该对象应该在所有控制器方法中都可用。

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


【解决方案1】:

我假设您在调用函数 isEmailExist(string emailID) 后尝试从 DataTable 获取 userId 值。 一旦你有了用户 ID,你就可以在调用 StoredProc 或任何其他东西时使用它。 一个可能的答案:

String userId = "";
DataTable dt = isEmailExist("x@x.com");
if(dt.Rows.Count == 1)
{
   userId = dt.Rows[0]["Id"];  // assuming Id is the column name
}

【讨论】:

    【解决方案2】:

    ResetPasswordModel 应该有用户 ID 或与用户相关的任何唯一信息,因为您要为用户重置密码。

    第二点,如果你知道email地址并且你想获取用户id你不应该使用DataSet,你只需要从存储过程中返回一个值,所以你应该使用ExecuteScalar,它只返回一个值

    【讨论】:

    • 将用户 ID 放入来自公司的模型数据中会产生漏洞,因为任何用户都可以重置另一个用户的密码。这是因为代码不检查现有密码,或者需要单击唯一的密码重置链接来证明身份。所以我们必须假设这是在登录会话期间发生的,因此用户 ID 应该从会话中的 User 对象中获取。
    猜你喜欢
    • 2012-04-07
    • 2021-12-14
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2014-04-12
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多