2014-01-22 60 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

相关问题