C#.net - MS Access - 插入语句,给出错误“语法错误”,

时间:2016-03-13 10:24:50

标签: c# ms-access-2007

insertBankMas = ""; 
insertBankMas = "INSERT INTO IntNotes (Room,Size) VALUES('" + txtRoom.Text + "','" + txtSize.Text + "')";    
PbdataAdapter = new OleDbDataAdapter(insertBankMas, PbSQLConnection);
openconnection();

insertcommand.ExecuteNonQuery();
MessageBox.Show("Room is Added");

请纠正我......

3 个答案:

答案 0 :(得分:2)

SIZE是Microsoft OleDb提供商的reserved keyword。您需要使用方括号(如[SIZE])。最佳做法是将其更改为 - 保留字。由于您的sql是INSERT查询,因此您不需要OleDbDataAdapter。从数据库中获取数据时将使用此结构。只需使用ExecuteNonQuery执行插入查询。

Bur更重要

您应始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。

还可以使用using statement自动处理您的OleDbConnectionOleDbCommand,而不是手动调用CloseDispose方法。

using(var connection = new OleDbConnection(conString))
using(var cmd = connection.CreateCommand())
{
    cmd.CommandText = "INSERT INTO IntNotes (Room, [Size]) VALUES(?, ?)";
    cmd.Parameters.Add("?", OleDbType.VarWChar).Value = txtRoom.Text;
    cmd.Parameters.Add("?", OleDbType.VarWChar).Value = txtSize.Text;
    // I assume your column types mapped with VarWChar

    connection.Open();
    int effectedRows = cmd.ExecuteNonQuery();
    if(effectedRows > 0)
    {
       MessageBox.Show("Room is Added");
    }   
}

顺便说一下,我强烈怀疑你的Size列应该(?)是基于它名称的一些数值。您可能希望改变它的列类型。

答案 1 :(得分:0)

可能发生错误,因为您在文本框中输入的数据包含需要转义的特殊字符。即使数据不需要转义,也不能使用字符串连接来构建sql命令,因为这会导致sql注入攻击。相反,您应该使用参数化语句并将用户数据作为参数传递。

有关详细信息,请参阅此文章: SQL Injection Attacks and Some Tips on How to Prevent Them

答案 2 :(得分:0)

我的真诚感谢大家,提醒我SIZE是一个关键词。它的工作,当我将SIZE字段名称更改为ROOMSIZE

由于 拉姆