我有一个简单的asp.net表单供个人填写,我在此特定页面上使用的代码可在其他几个位置使用,但是此页面给我带来了问题。
就是说INSERT语句中存在语法错误。您能看到有什么问题吗?
点击事件代码:
cmdInsert.CommandText = "INSERT INTO Position (Com_ID, Stu_ID, Pos_StartDate, Pos_Type, Pos_Description, Pos_Title) VALUES (' " & ddlCompany.SelectedValue & " ', ' " & ddlStudent.SelectedValue & " ', #" & CalStartDate.SelectedDate.Date & "#, ' " & ddlPositionType.SelectedValue & " ', ' " & txtDescription.Text & " ', ' " & txtPositionTitle.Text & " ');" 'MsgBox(cmdInsert.CommandText) cmdInsert.CommandType = CommandType.Text cmdInsert.Connection = cnnOLEDB cmdInsert.ExecuteNonQuery() txtPositionTitle.Text = "" txtDescription.Text = "Record inserted." CalStartDate.SelectedDates.Clear() cmdInsert.Dispose()
从表单捕获的数据与数据库中的数据类型对齐。有任何想法吗?
这是堆栈跟踪:
[OleDbException (0x80040e14): Syntax error in INSERT INTO statement.] System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +1081356 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +247 System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) +194 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) +58 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) +167 System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +113 Tiger_Recruiting.WebForm3.btnSaveStudentRecord_Click(Object sender, EventArgs e) in C:\Users\Garrett\Downloads\Tiger Recruiting(3)\Tiger Recruiting(3)\Tiger Recruiting(3)\Tiger Recruiting\Tiger Recruiting\position.aspx.vb:28 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +141 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +149 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +39 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +37 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +87 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4225
单词POSITION是MS-Access-Jet中的保留关键字。 您将其用作表名,因此需要将其用方括号括起来
cmdInsert.CommandText = "INSERT INTO [Position] .......
一部分原因是,您的代码非常糟糕。不要使用字符串Cancatenation来构建sql命令。 当您的输入中有一个单引号或您是否有其他字段需要输入值的特定格式时,这种做法会导致语法错误。但是最糟糕的是Sql Injection问题。
因此,您的代码应采用以下方式编写:
cmdInsert.CommandText = "INSERT INTO [Position] (Com_ID, Stu_ID, Pos_StartDate, Pos_Type, " + "Pos_Description, Pos_Title) VALUES " + "(?,?,?,?,?,?)" cmdInsert.Parameters.AddWithValue("@p1",ddlCompany.SelectedValue) cmdInsert.Parameters.AddWithValue("@p2",ddlStudent.SelectedValue) cmdInsert.Parameters.AddWithValue("@p3",CalStartDate.SelectedDate.Date) cmdInsert.Parameters.AddWithValue("@p4",ddlPositionType.SelectedValue) cmdInsert.Parameters.AddWithValue("@p5",txtDescription.Text) cmdInsert.Parameters.AddWithValue("@p6",txtPositionTitle.Text) cmdInsert.Connection = cnnOLEDB cmdInsert.ExecuteNonQuery()