c# - 如何处理 Access INSERT 语句和 .NET DataGridView 控件中的语法错误?

标签 c# ms-access datagridview syntax-error sql-insert

我正在使用 Access (.accdb) 和一个用 C# 编写的 Windows 窗体应用程序。
当我尝试将数据插入数据库表时出现此错误。

System.Data.OleDb.OleDbException:INSERT INTO 语句中的 Sintax 错误。
适配器.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();
        }
        //}
    }
}

最佳答案

不应将字符串连接到 SQL 语句中。
这样做会破坏代码并创建 SQL 注入(inject)漏洞。

相反,您应该使用参数。

例如:

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

关于c# - 如何处理 Access INSERT 语句和 .NET DataGridView 控件中的语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235924/

相关文章:

c# - 如果 if 的 bool 参数之一为 null,为什么 else 语句不会被执行?

c# - "this is ClassName"语句在 C# 中意味着什么?

c# - 在 Workflow Foundation 4 中管理 ObjectContext

sql - 具有多个WHERE条件的UPDATE语句

c# - 如何将外部 .exe 添加到我的 C# 项目中?

c# - DataGridView 数据绑定(bind)到 List<List<T>>

c# - 绑定(bind)数据源正在改变我的专栏

c# - datagridview 添加行

c# - 为什么 Lucene.NET IndexSearcher 返回零结果?

c# - 使用 Access 的 Dapper ORM 删除功能