开发者

How to handle a syntax error in an Access INSERT statement and a .NET DataGridView control?

I'm working with Access (.accdb), and a Windows Forms application, written in C#.

I get this error when I'm trying to insert data into a database table.

System.Data.OleDb.OleDbException:Sintax error in INSERT INTO statement. adaptador.InsertCommand.ExecuteNonQuery();

I have tried to go through the direct route and update method but coming up with the same error!

My 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);
            ada开发者_StackOverflow中文版ptador.InsertCommand.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        finally
        {
            conn.Close();
        }
        //}
    }
}


You should not concatenate strings into SQL statements.
By doing so, you break your code and create a SQL injection vulnerability.

Instead, you should use parameters.

For example:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜