执行INSERT INTO语句时出现OleDb异常0x80040e14如何解决
异常原因
OleDb异常0x80040e14属于SQL语法错误,你的代码里有两个核心问题触发报错:
- 带空格的列名未做转义处理:
Choice A、Choice B、Correct Answer这些列名包含空格,OleDb无法直接识别这类标识符,必须用方括号包裹才能正常解析。 - 直接拼接SQL字符串:如果输入的题目、选项内容里包含单引号,会直接打断SQL的语法结构,同时这种写法还存在SQL注入的安全隐患。
解决方法
采用参数化查询改写代码,同时给带空格的列名加上方括号转义,修正后的代码如下:
private void AddQuiz_Button_Submit_Click(object sender, EventArgs e) { // using会自动释放连接资源,无需手动关闭 using(OleDbConnection myConnection = GetConnection()) { // 带空格的列名用[]包裹,参数用?占位 string myQuery = @"INSERT INTO QuestionBank (Question, [Choice A], [Choice B], [Choice C], [Choice D], Category, [Correct Answer]) VALUES (?, ?, ?, ?, ?, ?, ?)"; OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection); // 按占位符顺序添加参数,OleDb按位置匹配参数,顺序不能错 myCommand.Parameters.AddWithValue("p1", AddQuiz_RichTextBox_Question.Text); myCommand.Parameters.AddWithValue("p2", OptionA_TextBox.Text); myCommand.Parameters.AddWithValue("p3", OptionB_TextBox.Text); myCommand.Parameters.AddWithValue("p4", OptionC_TextBox.Text); myCommand.Parameters.AddWithValue("p5", OptionD_TextBox.Text); myCommand.Parameters.AddWithValue("p6", AddQuiz_Category_Listbox.Text); myCommand.Parameters.AddWithValue("p7", AddQuiz_ListBox_Answer.Text); try { myConnection.Open(); AddQuiz_Label_CheckConnection.Text = "Connection Successful"; myCommand.ExecuteNonQuery(); MessageBox.Show("Question saved"); } catch (Exception ex) { MessageBox.Show("Exception in DBHandler" + ex); } } }
额外说明
- OleDb的参数是位置匹配,不需要严格对应参数名,只要添加参数的顺序和SQL里?的顺序一致即可。
- 如果你后续修改SQL的字段顺序,必须同步调整参数添加的顺序,否则会出现数据插错列的问题。
- 参数化查询既解决了输入含单引号导致的语法报错,也完全避免了SQL注入风险,比字符串拼接的写法更安全稳定。
内容的提问来源于stack exchange,提问作者KcNco
相关产品推荐
相关产品推荐

