【问题标题】:Incorrect Syntax in Insert statementInsert 语句中的语法不正确
【发布时间】:2014-07-29 07:42:49
【问题描述】:

打开和关闭连接:

OleDbConnection conn;
private void ConnectToDatabase()
{
    // Creates a connection to the database using an absolute path.
    conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +Server.MapPath("App_Data\\BookRatings.accdb"));
    // Opens the connection.
    conn.Open();
}
private void DisconnectDatabase()
{
    // The connection is closed.
    conn.Close();
}

注册用户

 public void RegisterCustomer(string userName, string Address, string Tel, string Email, string Ques, string Ans, string Pass)
{
    // Connect to database.
    ConnectToDatabase();
    // Inserts the necessary values into the database.
    OleDbCommand cmd = conn.CreateCommand();
    cmd.CommandText = (@"INSERT INTO user ([userName], [Address],[telephone], [emailAddress], [Password], [securityQuestion], [securityAnswer]) VALUES ('" + userName + "', '" + Address + "', '" + Tel + "', '" + Email + "', '" + Pass + "', '" + Ques + "', '" + Ans + "')");
    cmd.ExecuteNonQuery();
    // The connection is closed.
    DisconnectDatabase();
}

错误信息

“/”应用程序中的服务器错误。

INSERT INTO 语句中的语法错误。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.Data.OleDb.OleDbException:语法错误 INSERT INTO 语句。

来源错误:

第 100 行:cmd.ExecuteNonQuery();第 101 行:// 连接关闭。第 102 行:断开数据库();第 103 行: 第 104 行:[WebMethod]

源文件:*\bookClub\Service.aspx.cs 行:102

堆栈跟踪:

[OleDbException (0x80040e14): INSERT INTO 语句中的语法错误。] System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时) +1102900
System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams、对象和执行结果)+247
System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象& 执行结果)+189
System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果)+58
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)+162
System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +107
Service.RegisterCustomer(String userName, String Address, String Tel, String Email, String Ques, String Ans, String Pass) in *\bookClub\Service.aspx.cs:102 Register.btnRegister_Click(Object sender, EventArgs e) in *\bookClub\Register.aspx.cs:46
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9752490
System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 事件参数)+196
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,字符串 eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint) +1724

我不明白为什么关闭线会出现问题?或者为什么它在插入时崩溃...

【问题讨论】:

  • 您的代码容易受到 SQL 注入攻击,请使用 SQL 参数而不是将参数直接连接到字符串中。
  • 嗨,您知道您的代码容易受到SQL Injection 攻击吗?这也可能是您遇到错误的根源,尽管我认为 Tanner 在这方面更正确。你绝对不应该像那样编写连接 SQL 的代码,而应该使用 SQL 参数。

标签: c# sql database ms-access syntax


【解决方案1】:

用户是 MS Access 中的 reserved word,因此只需更新您的 SQL 命令以将 USER 括在方括号中:

cmd.CommandText = (@"INSERT INTO [user] ([userName]....

另外,正如cmets中提到的,最好使用参数化查询来防止SQL注入攻击。

看看这个问题的答案,它会告诉你如何做到这一点:

Using parameters inserting data into access database

此外,在该示例中,它使用了一个 Using 块,用于处理关闭和释放您的连接,这比手动执行要好。您的代码看起来像这样,带有参数和 Using 块:

conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +Server.MapPath("App_Data\\BookRatings.accdb"));
conn.Open();

// DbCommand also implements IDisposable
using (OleDbCommand cmd = conn.CreateCommand())
{
   // create command with parameter placeholders
   cmd.CommandText = 
        @"INSERT INTO [user] ([userName], [Address],[telephone]....) " +
         "VALUES (@username, @address, @telephone,....)");

   // add named parameters
   cmd.Parameters.AddRange(new OleDbParameter[]
   {
        new OleDbParameter("@userName", userName),
        new OleDbParameter("@address", Address),
        new OleDbParameter("@telephone", Tel),
        ...
    };

    // execute
    cmd.ExecuteNonQuery();
}

【讨论】:

  • +1 - 我认为他也不应该有额外的方法 ConnectToDatabase() 和 DisconnectDatabase() - using 块会更好..
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多