INSERT INTO语句中的语法错误OleDbException未被用户代码解析

时间:2017-03-10 13:09:24

标签: sql asp.net

我的代码:

 string MySQL = "INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, e-mail) ";
MySQL += "VALUES ('" + Request.Form["username"] + "', '" + Request.Form["fname"] + "', '" + Request.Form["id"] + "', '" + Request.Form["age"] + "', '" + Request.Form["pass"] + "', '" + Request.Form["email"] + "');";
string strConnection = "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" + System.Web.HttpContext.Current.Server.MapPath(@"App_Data/RegisterDatabase.accdb");
System.Data.OleDb.OleDbConnection o_con = new System.Data.OleDb.OleDbConnection(strConnection);
System.Data.OleDb.OleDbCommand o_command = new System.Data.OleDb.OleDbCommand(MySQL, o_con);
o_con.Open();
o_command.ExecuteNonQuery();
o_con.Close();

我得到了

  

INSERT INTO语句中的语法错误“in o_command.ExecuteNonQuery();   并且用户代码没有使用OleDbException。

以下是大部分内容的图片: https://i.gyazo.com/d6c30ee3f9988d5d22793540aea98a6c.png

2 个答案:

答案 0 :(得分:0)

发现问题:

使用Access执行查询时,它给了我同样的错误,因此我删除了电子邮件中的“ - ”并且它有效。

使用访问权限时,请确保在字段名称中不使用特殊字符。

答案 1 :(得分:0)

  1. 使用参数化的sql,不要使用值的字符串连接来创建带有值的sql语句。一旦有人决定在他们的名字中包含撇号',你的代码就会失败(硬)的一个原因。如果你定位像Sql Server这样的数据库,你也容易受到SQL注入攻击。
  2. using块中包装您的dipsosable类型,以确保即使出现异常,资源(在这种情况下 db连接)也会关闭。
  3. web.config中存储连接字符串并按名称引用它们,除非有充分的理由,否则不要在代码中构建它们。
  4. 范围Ado.Net实例,您需要它们然后销毁它们(再次使用块),这可以确保您以后在共享连接或仍然存在的连接上发生争用时不会遇到问题打开的时间比应该的长。
  5. 关于密码的附注:永远不要将它们存储为纯文本。永远!使用安全的散列算法,例如pbkdf2其中一个好的)并稍后比较哈希值。
  6. 现在主要问题是"INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, e-mail),特别是e-mail。您需要使用[]来转义该名称以将其括起来以确保-字符不会导致语法问题。更正后的字符串变为:

    INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, [e-mail])
    

    以下是包含这些更改的代码。我猜测了id和age的类型,并将它们作为那些类型传递。如你所愿,进一步细化。

    string strConnection = System.Configuration.ConfigurationManager.ConnectionStrings["yourConnectionName"].ConnectionString;
    using (OleDbConnection con = new OleDbConnection(strConnection))
    using (OleDbCommand cmd = new OleDbCommand())
    {
        cmd.Connection = con;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, [e-mail]) VALUES(?,?,?,?,?,?)";
    
        cmd.Parameters.Add(new OleDbParameter("@uName", OleDbType.VarChar)).Value = Request.Form["username"];
        cmd.Parameters.Add(new OleDbParameter("@pName", OleDbType.VarChar)).Value = Request.Form["fname"];
        cmd.Parameters.Add(new OleDbParameter("@idNumber", OleDbType.Int)).Value = int.Parse(Request.Form["id"]);
        cmd.Parameters.Add(new OleDbParameter("@age", OleDbType.Int)).Value = int.Parse(Request.Form["age"]);
        cmd.Parameters.Add(new OleDbParameter("@pass", OleDbType.VarChar)).Value = Request.Form["pass"];
        cmd.Parameters.Add(new OleDbParameter("@email", OleDbType.VarChar)).Value = Request.Form["email"];
    
        con.Open();
        cmd.ExecuteNonQuery();
    }