2013-02-15 3 views
1

Я делаю webmethod в C#. При отладкеравно в C# is true

(chk.Equals(oldpass)) 

запрос показывает то же значение как с левой, так и с правой стороны.

Но все же, вместо того, чтобы идти внутрь if, выполнение переходит в другую часть, отображающую оператор возврата. 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 [email protected] where [email protected] and [email protected]"; 
      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#. Спасибо.

+0

где код для извлечения пароля в первую очередь? –

+0

- это 'oldpass' также запрос? где он установлен? –

+0

отправлен код ошибки ... – Shachi

ответ

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 [email protected] where [email protected] and [email protected]"; 
       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(); 
      }    
     } 

Надеюсь, что это поможет другим новичкам, как я!

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 [email protected] where [email protected] and [email protected]"; 

       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(); 
+1

Не используйте String.Format для создания запросов. – CodeCaster

+0

@downvoter - любое объяснение?pls выходят объяснение! –

+0

@CodeCaster - это причина для downvote? –

5

Вы не выполнили команду: старый пароль CHK является: "выбрать PWD от клиента, где authenid ​​= ' "+ @authenid ​​+"'";, который маловероятный пароль. Например, посмотрите на ExecuteScalar.

Дополнительные мысли:

  • Спараметрировать СКП - не сцепить идентификатор; он должен быть "select pwd from client where authenid = @authenid";, где вы добавляете параметр с именем authenid со значением от authenid. Вы получите это право во втором запросе ADO.NET.
  • пароли должны быть солеными и хэшированными: не сохраняются непосредственно; Вы никогда не должны быть в состоянии извлечь и/или расшифровать пароль

(внешние изменения)

Update: Выполнить код в "select pwd from client where authenid = '"+ @authenid +"' ";"select pwd from client where authenid = '@authenid' ";, потому что возвращает нулевое значение.

update2: cmd.ExecuteScalar(); сделал это работа. И удалите cmd.ExecuteNonQuery();

+0

получил проницательность .. :) – Shachi

+0

+1, также известен этот тип пароля и должен быть специальным обсаженным;) http://xkcd.com/327/ –

+0

@Marc Gravell - Ты спас день! благодаря :) – Shachi

Смежные вопросы