2010-11-21 8 views
0

私はAccess(.accdb)とC#で書かれたWindows Formsアプリケーションを扱っています。
データベーステーブルにデータを挿入しようとしているときにこのエラーが発生します。Access INSERTステートメントと.NET DataGridViewコントロールで構文エラーを処理する方法はありますか。

System.Data.OleDb.OleDbException:INSERT INTOステートメントでSintaxエラーが発生しました。 adaptador.InsertCommand.ExecuteNonQuery();

私は直接ルートと更新メソッドを実行しようとしましたが、同じエラーが発生しています!

マイコード:

private void btnCronograma_Click(object sender, EventArgs e) 
{ 
    OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=mydatabase.accdb"); 
    string sql; 
    int idProyecto, idMes, meta, real; 

    OleDbDataAdapter adaptador = new OleDbDataAdapter(); 

    //for (int i = 0; i < this.dataGridView8.Rows.Count - 1; i++) 
    //{ 
    foreach (DataGridViewRow row in dataGridView8.Rows) 
    { 
     DataGridViewComboBoxCell combo3 = row.Cells["idProyecto"] as DataGridViewComboBoxCell; 
     DataGridViewComboBoxCell combo4 = row.Cells["idMes"] as DataGridViewComboBoxCell; 

     MessageBox.Show(combo3.Value.ToString()); 
     MessageBox.Show(combo4.Value.ToString()); 

     idProyecto = int.Parse(combo3.Value.ToString()); 
     idMes = int.Parse(combo4.Value.ToString()); 

     meta = int.Parse(dataGridView8.Rows[0].Cells[3].Value.ToString()); 
     real = int.Parse(dataGridView8.Rows[0].Cells[4].Value.ToString()); 
     MessageBox.Show(meta.ToString()); 
     MessageBox.Show(real.ToString()); 

     //for (int i = 0; i < this.dataGridView8.Rows.Count - 1; i++) 
     //{ 
     sql = "INSERT INTO IndicadorProyecto (idProyecto, idMes, meta, real) VALUES('" + idProyecto + "' , '" + 
       idMes + "' , '" + meta + "' , '" + real + "') "; 

     //sql = "INSERT INTO IndicadorProyecto (idMes, meta, real) VALUES('" + idMes + "' , '" + meta + "' , '" + real + "') "; 

     if (combo3 == null) 
     { 
      MessageBox.Show("No se pudo convertir"); 
     } 
     else if (combo4 == null) 
     { 
      MessageBox.Show("No se pudo convertir"); 
     } 
     else 
     { 

     } 

     try 
     { 
      conn.Open(); 
      adaptador.InsertCommand = new OleDbCommand(sql, conn); 
      adaptador.InsertCommand.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
     //} 
    } 
} 

答えて

2

あなたは、SQL文の中に文字列を連結するべきではありません。
これにより、コードが破損し、SQLインジェクションの脆弱性が発生します。

代わりに、パラメータを使用する必要があります。例えば

using (var conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=mydatabase.accdb")) 
using (var command = new OleDbCommand(@"INSERT INTO IndicadorProyecto (idProyecto, idMes, meta, real) VALUES(?, ?, ?, ?") { 
    command.Parameters.AddWithValue("a", idProyecto); 
    command.Parameters.AddWithValue("b", idMes); 
    command.Parameters.AddWithValue("c", meta); 
    command.Parameters.AddWithValue("d", real); 

    conn.Open(); 
    command.ExecuteNonQuery(); 
} 
+1

私はいつも**あなたがに基づいて文字列の制御にいる場合、例えば、**オプションの選択許容する文字列を連結すると考えられてきました。 – RolandTumble

関連する問題