2016-01-06 29 views
-1

我試圖添加一個更改密碼功能到我的程序,但它不斷拉動錯誤。這就是所謂的代碼這就是當你點擊保存運行:在位置0沒有行OleDb數據庫

private void button3_Click(object sender, EventArgs e) 
    { 

     OleDbConnection con = new OleDbConnection(); 
     con.ConnectionString = (@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\User\Desktop\esoft\gym\gym\bin\Debug\Clients.accdb"); 

     OleDbDataAdapter da = new OleDbDataAdapter(" SELECT COUNT(*) FROM login WHERE username='"+textBox1.Text+ "' AND password='" + textBox2.Text + "'",con); 
     DataTable dt = new DataTable(); 

     con.Open(); 
     errorProvider1.Clear(); 
     if (dt.Rows[0][0].ToString() == "1") 
     { 
      if (textBox3.Text == textBox4.Text) 
      { 
       OleDbDataAdapter sda = new OleDbDataAdapter("UPDATE login WHERE username ='" + textBox1.Text + "', password='" + textBox2.Text + "' (password ='" + textBox3.Text + "')", con); 
       sda.Fill(dt); 
       MessageBox.Show("password successfully changed", "success!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      else 
      { 
       errorProvider1.SetError(textBox3, "passwords dont match"); 
       errorProvider1.SetError(textBox4, "passwords dont match"); 
      } 
     } 

     else 
     { 
      errorProvider1.SetError(textBox1, "wrong username"); 
      errorProvider1.SetError(textBox2, "wrong pasword"); 

     } 
     con.Close(); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 

    } 

現在的主要錯誤是,試圖保存時,它改變的時候拉了一個錯誤,指出沒有行被發現在位置3到[1] [5]它爲該位置提出了相同的錯誤。

我使用您的建議更改了代碼,但仍然得到相同的錯誤。

private void button3_Click(object sender, EventArgs e) 
    { 

     using (OleDbConnection con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\User\Desktop\esoft\gym\gym\bin\Debug\Clients.accdb")) 
     { 


      OleDbDataAdapter da = new OleDbDataAdapter(" ExecuteScalar FROM login WHERE username='" + textBox1.Text + "' AND password='" + textBox2.Text + "'", con); 
      DataTable dt = new DataTable(); 

      con.Open(); 
      errorProvider1.Clear(); 
      if (dt.Rows[0][0].ToString() == "1") 
      { 
       if (textBox3.Text == textBox4.Text) 
       { 
        // OleDbDataAdapter sda = new OleDbDataAdapter("UPDATE login SET password ='" + textBox3.Text + "' WHERE username ='" +textBox2.Text+"'"); 

        OleDbCommand com = new OleDbCommand("UPDATE login SET password = '" + textBox3.Text + "' WHERE username = '" +textBox2.Text+"'",con); 
        com.ExecuteNonQuery(); 
       // sda.Fill(dt); 
        MessageBox.Show("password successfully changed", "success!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 
       else 
       { 
        errorProvider1.SetError(textBox3, "passwords dont match"); 
        errorProvider1.SetError(textBox4, "passwords dont match"); 
       } 
+0

這行的目的是什麼?OleDbDataAdapter da = new OleDbDataAdapter(「SELECT COUNT(*)FROM login WHERE username ='」+ textBox1.Text +「'AND password ='」+ textBox2.Text +「'」, con);'你聲明它,但永遠不會執行代碼來填充'OleDbDataAdapter',如果你只返回一行google,那麼你應該使用'ExecuteScalar'當你有時間 – MethodMan

回答

1

你正在做一些錯事;

  • 使用ExecuteScalar爲您的SELECT COUNT(*)聲明,這正是這是什麼。
  • 即使如果你不這樣做,你畢竟不會填寫你的dt
  • 對於您的UPDATE聲明,您需要使用ExecuteNonQueryDataAdapter用於返回一些數據。
  • 您忘記在您的UPDATE聲明中使用SET
  • 對於多個WHERE條件,您需要使用ANDOR,而不是,
  • 您應該始終使用parameterized queries。這種字符串連接對於SQL Injection攻擊是開放的。
  • 使用using語句自動處置您的連接和命令,而不是手動調用Close方法。
  • 不要將密碼存儲爲純文本。閱讀:Best way to store password in database
  • 密碼是OLE DB提供程序中的reserved keyword。根據您的數據庫管理器區分大小寫的設置,您可能需要使用的值爲[password]。但作爲一種更好的方式,即使它是,仍將其更改爲 - 保留字。
+0

嗯,我做了你們上面建議的所有事情,並仍然得到相同的錯誤.. – iboss

1

這是因爲您錯過了SET關鍵字。您的查詢

UPDATE login WHERE username ='" + 

應該

UPDATE login SET columnname = value WHERE username ='" + 

根據您發佈的代碼看起來應該是

UPDATE login SET password ='" + textBox3.Text + "' WHERE username ='" + 

儘管如此,使用參數化查詢,也不會像串聯用戶輸入你現在正在做的方式,否則你已經打開了SQL注入的大門。