使用此INSERT INTO语句和.NET OleDb命名空间时如何解决语法错误?

How*_*ard 1 c# oledb ms-access syntax-error sql-insert

当我尝试将值插入Access数据库时,我一直收到错误.

错误是语法错误,导致以下异常:

INSERT INTO语句中的OleDbException未处理语法错误.

private OleDbConnection myCon;

public Form1()
{
    InitializeComponent();
    myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
    OleDbCommand cmd = new OleDbCommand();
    myCon.Open();
    cmd.Connection = myCon;
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
                                        "[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
                      "VALUES ('" + userid.Text.ToString() + "' , '" +
                                    fname.Text.ToString() + "' , '" +
                                    sname.Text.ToString() + "' , '" +
                                    dob.Text.ToString() + "' , '" +
                                    tarweight.Text.ToString() + "' , '" +
                                    tarcal.Text.ToString() + "' , '" +
                                    height.Text.ToString() + "')";

    cmd.ExecuteNonQuery();
    myCon.Close();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

好吧,您还没有指定错误是什么 - 但您的第一个问题是您将数据直接插入SQL语句.不要那样做.您正在邀请SQL注入攻击.

请改用参数化的SQL语句.完成后,如果仍有问题,请使用新代码编辑此问题并说明错误是什么.新代码可能已经更加清晰,因为不会涉及巨大的连接,容易隐藏类似不匹配的括号.

编辑:正如评论中所提到的,Jet/ACE容易受到较少类型的SQL注入攻击,因为它不允许使用DML.对于这个INSERT语句,实际上可能没有漏洞 - 但对于具有以类似方式编写的WHERE子句的SELECT,用户输入可以绕过WHERE子句的一些保护.我强烈建议您使用参数化查询作为理所当然的事情:

  • 它们意味着您不必转义用户数据
  • 它们将数据与代码分开
  • 如果您从Jet/ACE迁移(无论是移动此特定代码,还是仅仅是您个人开始在不同的数据库上工作),您都不必担心
  • 对于其他数据类型(如日期),您无需进行任何工作即可将数据转换为适合数据库的格式

(你也并不需要所有的通话ToString,不仅我期望一个名为属性Text已经一个字符串,但事实上,你使用字符串连接意味着字符串转换无论如何都会自动发生.)