c#中的等于是真的

时间:2013-02-15 07:24:57

标签: c# equals webmethod

我在c#中做webmethod。在调试时,

(chk.Equals(oldpass))

查询在左侧和右侧都显示相同的值。

但是,如果执行移动到显示return语句的else部分,而不是进入内部。 FOLL。是我的代码。

[WebMethod (Description="for change in password")]
public string update(string authenid,string oldpass,string newpass)
{
     SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Workspace\\visual studio workspace\\Tmrepo\\App_Data\\tmrepo.mdf;Integrated Security=True;User Instance=True");

    try
    {
        conn.Open();

  string chk = "select pwd from client where authenid = '"+ @authenid +"' ";
        if(chk.Equals(oldpass))
        {
            string update = "update client set pwd=@newpass where pwd=@oldpass and authenid=@authenid";
            SqlCommand cmd = new SqlCommand(update, conn);
            cmd.Connection = conn;
            cmd.Parameters.AddWithValue("@authenid", authenid);
            cmd.Parameters.AddWithValue("@oldpass", oldpass);
            cmd.Parameters.AddWithValue("@newpass", newpass);
            cmd.ExecuteNonQuery();

        }

        else
        {
            return "invalid oldpass";
        }
 conn.Close();
        return newpass;
    }
    catch (Exception ex)
    {
        return ex.ToString();
    }

}

这段代码有什么问题吗?我是c#newbie。 感谢。

3 个答案:

答案 0 :(得分:5)

你还没有执行命令:你的旧密码chk是:“从客户端选择pwd,其中authenid ='”+ @authenid +“'”;这是一个不太可能的密码。例如,查看ExecuteScalar。

其他想法:

  • 参数化 sql - 不要连接id;它应该是"select pwd from client where authenid = @authenid";,您要在其中添加名为authenid的参数,其值为authenid。您可以在第二个ADO.NET查询中获得此权限。
  • 密码应加盐和散列:不直接存储;你永远不能提取和/或解密密码

(外部编辑)

更新:执行代码为"select pwd from client where authenid = '"+ @authenid +"' ";,因为"select pwd from client where authenid = '@authenid' ";返回空值。

<强> UPDATE2 cmd.ExecuteScalar();让它发挥作用。并删除cmd.ExecuteNonQuery();

答案 1 :(得分:4)

你的代码所做的是将select pwd from client where authenid = some_value与oldpass的值进行比较,这将是错误的!

固定代码逻辑:

        string oldpass = "somehing";

        string authenid = "pass_to_test";
        string sql = string.Format("select pwd from client where authenid = '{0}' ", authenid);
        string chk = null;
        SqlCommand cmd = new SqlCommand(update, conn);

        var reader = cmd.ExecuteReader();
        if (reader.Read())
        {
            // has record with username
            chk = reader.GetString(0);
            if (chk.Equals(oldpass))
            {
                string update = "update client set pwd=@newpass where pwd=@oldpass and authenid=@authenid";

                cmd.CommandText = update;
                cmd.Connection = conn;
                cmd.Parameters.AddWithValue("@authenid", authenid);
                cmd.Parameters.AddWithValue("@oldpass", oldpass);
                cmd.Parameters.AddWithValue("@newpass", newpass);
                cmd.ExecuteNonQuery();

            }

            else
            {
                return "invalid oldpass";
            }

        }
        else
        {
            // not a valid username
        }
        reader.Close();
        reader.Dispose();

答案 2 :(得分:1)

最后,解决了!我用过数据集。完美正确代码的第二种方法是:

string chk = "select pwd from client where authenid = @authenid";
        SqlCommand cmd1 = new SqlCommand(chk , conn);
        cmd1.Parameters.AddWithValue("@authenid", authenid);
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd1);
        da.Fill(ds);
        int cnt = ds.Tables[0].Rows.Count;
        if (cnt > 0)
        {
            if (ds.Tables[0].Rows[0]["pwd"].ToString().Equals(oldpass))
            {
                string update = "update client set pwd=@newpass where pwd=@oldpass and authenid=@authenid";
                SqlCommand cmd = new SqlCommand(update, conn);
                cmd.Connection = conn;
                cmd.Parameters.AddWithValue("@authenid", authenid);
                cmd.Parameters.AddWithValue("@oldpass", oldpass);
                cmd.Parameters.AddWithValue("@newpass", newpass);
                cmd.ExecuteNonQuery();
            }            
        }

希望它可以帮助像我这样的其他新手!!