2014-01-22 77 views
1

我想我得到了插入語法,但我總是得到這個錯誤。當我嘗試類似的不同項目時,它工作得很好。你可以幫我嗎?INSERT語句中的語法錯誤(訪問數據庫)

private void addbtn_Click(object sender, EventArgs e) 

    { 
     if (idkaryawantxt.Text != "") 
     { 
      string q = "insert into Table1 (Nama,No_Identitas,Alamat,Lahir,Tanggal_Lahir,Telepon,Divisi,Aktif,Password) values ('" + namakaryawantxt.Text.ToString() + "','" + identitastxt.Text.ToString() + "','" + alamattxt.Text.ToString() + "','" + lahirtxt.Text.ToString() + "','" + tgllahirtxt.Text.ToString() + "','" + tlpntxt.Text.ToString() + "','" + divisitxt.Text.ToString() + "','" + aktiftxt.Text.ToString() + "','" + passwordtxt.Text.ToString() + "')"; 

      dosomething(q); 

     } 
    } 

    private void dosomething(String q) 
    { 
     try 
     { 

      connect.Open(); 
      command.CommandText = q; 
      command.ExecuteNonQuery(); 
      connect.Close(); 


      loaddata(); 
     } 
     catch (Exception e) 
     { 
      connect.Close(); 
      MessageBox.Show(e.Message.ToString()); 
     } 
    } 


    //REFRESH 
    private void loaddata() 
    { 
     datakaryawan.AllowUserToAddRows = false; 

     datakaryawan.Rows.Clear(); 
     datakaryawan.Refresh(); 


     connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\C# Project\minor\Karyawan.accdb;Persist Security Info=False;"; 

     connect.Open(); 



     command.Connection = connect; 
     command.CommandText = "SELECT * FROM Table1"; 

     OleDbDataReader reader = command.ExecuteReader(); 


     while (reader.Read()) 
     { 
      datakaryawan.Rows.Add(); 

      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["ID_Karyawan"].Value = reader[0].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["Nama_Karyawan"].Value = reader[1].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["No_Identitas"].Value = reader[2].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["Alamat"].Value = reader[3].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["PoB"].Value = reader[4].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["DoB"].Value = reader[5].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["Telepon"].Value = reader[6].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["Divisi"].Value = reader[7].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["Aktif"].Value = reader[8].ToString(); 
      datakaryawan.Rows[datakaryawan.Rows.Count - 1].Cells["Password"].Value = reader[9].ToString(); 
     } 




     connect.Close(); 

     idkaryawantxt.Text = datakaryawan.Rows[0].Cells[0].Value.ToString(); 
     namakaryawantxt.Text = datakaryawan.Rows[0].Cells[1].Value.ToString(); 
     identitastxt.Text = datakaryawan.Rows[0].Cells[2].Value.ToString(); 
     alamattxt.Text = datakaryawan.Rows[0].Cells[3].Value.ToString(); 
     lahirtxt.Text = datakaryawan.Rows[0].Cells[4].Value.ToString(); 
     tgllahirtxt.Text = datakaryawan.Rows[0].Cells[5].Value.ToString(); 
     tlpntxt.Text = datakaryawan.Rows[0].Cells[6].Value.ToString(); 
     divisitxt.Text = datakaryawan.Rows[0].Cells[7].Value.ToString(); 
     aktiftxt.Text = datakaryawan.Rows[0].Cells[8].Value.ToString(); 
     passwordtxt.Text = datakaryawan.Rows[0].Cells[9].Value.ToString(); 

    } 
+4

首先要做的事情沒有其他可接受的方法:停止把值直接進入你的SQL。改用參數化的SQL。這*可能*解決了這個問題,它肯定會使問題更容易看出來。 –

回答

1

單詞PASSWORD是爲MS-Access數據庫保留的。
如果你想使用它,你需要將其封裝在方括號

string q = @"insert into Table1 (Nama,No_Identitas,Alamat,Lahir,Tanggal_Lahir, 
       Telepon,Divisi,Aktif,[Password]) values (.....)"; 

說,記住,字符串連接,形成一個SQL命令是不好的做法,應該不惜一切代價使用參數來避免查詢。

構建sql命令的字符串連接最糟糕的問題是Sql Injection攻擊的可能性,但是當您需要使用它們的值構建字符串連接的查詢時,包含單引號,日期和浮點值的字符串也會成爲問題文本。

例如,如果其中一個文本字段包含用戶輸入的單引號,會發生什麼情況?另一個語法錯誤,因爲當你連接一個包含引號的字符串時,你會中斷命令所需的語法。

所以有比使用參數化查詢

string q = @"insert into Table1 (Nama,No_Identitas,Alamat,Lahir,Tanggal_Lahir, 
       Telepon,Divisi,Aktif,[Password]) values (?,?,?,?,?,?,?,?,?,?)"; 
using(OleDbConnection connect = new OleDbConnection(.....)) 
using(OleDbCommand cmd = new OleDbCommand(q, connect) 
{ 
    connect.Open() 
    cmd.Parameters.AddWithValue("@p1", namakaryawantxt.Text); 
    ... so on for the other 8 parameters 
    ... REMEMBER TO ADD THEM IN THE SAME ORDER OF THE PLACEHOLDERS ... 
    cmd.ExecuteNonQuery(); 
} 
+0

啊我的壞我忘了補充,這裏的密碼是文本類型。但Tanggal_Lahir(日期分娩)和Aktif是日期和時間類型,你認爲我在那裏錯了嗎? – wendy

+1

始終使用參數化查詢並將引用作業留在框架代碼中。它知道更好 – Steve

+0

它幫助史蒂夫和Jon Skeet,下一次我要使用參數化查詢。非常感謝你的麻煩。 – wendy

相關問題