我在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。 感谢。
答案 0 :(得分:5)
你还没有执行命令:你的旧密码chk是:“从客户端选择pwd,其中authenid ='”+ @authenid +“'”;这是一个不太可能的密码。例如,查看ExecuteScalar。
其他想法:
"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();
}
}
希望它可以帮助像我这样的其他新手!!