2010-11-21 4 views
0

Je travaille avec Access (.accdb), et une application Windows Forms, écrite en C#.
Je reçois cette erreur lorsque j'essaie d'insérer des données dans une table de base de données.Comment gérer une erreur de syntaxe dans une instruction Access INSERT et un contrôle .NET DataGridView?

System.Data.OleDb.OleDbException: erreur Sintax dans l'instruction INSERT INTO. adaptador.InsertCommand.ExecuteNonQuery();

J'ai essayé de passer par la méthode de mise à jour directe et de mise à jour mais en arrivant avec la même erreur!

Mon code:

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(); 
     } 
     //} 
    } 
} 

Répondre

2

Vous ne devriez pas concaténer des chaînes dans les instructions SQL. En faisant cela, vous cassez votre code et créez une vulnérabilité d'injection SQL.

Au lieu de cela, vous devez utiliser des paramètres.

Par exemple:

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

J'ai toujours considéré cordes concaténer acceptable ** si ** vous êtes dans le contrôle des chaînes basées sur, par exemple, un choix d'options. – RolandTumble

Questions connexes