INSERT INTO语句vb.net和access数据库中出现语法错误
我正在编写的程序(在vb.net中)应该是将文本框中的值加载到数据库中。 然而,当我点击“保存”时,一开始什么也没发生。没有错误,没有通知,什么都没有。所以我使用断点跟踪它,它得到:INSERT INTO语句vb.net和access数据库中出现语法错误,vb.net,ms-access,Vb.net,Ms Access,我正在编写的程序(在vb.net中)应该是将文本框中的值加载到数据库中。 然而,当我点击“保存”时,一开始什么也没发生。没有错误,没有通知,什么都没有。所以我使用断点跟踪它,它得到: daTraining.Update(dsTraining, "Training") 然后就停了下来。 所以我投入了一次尝试/接球,现在当我点击save时,我得到了 System.Data.OleDB.OledgException (0x80040E14): Syntax error in INSERT INTO
daTraining.Update(dsTraining, "Training")
然后就停了下来。
所以我投入了一次尝试/接球,现在当我点击save时,我得到了
System.Data.OleDB.OledgException (0x80040E14): Syntax error in INSERT INTO statement.
我不知道如何解决这个问题,或者问题可能是什么
代码
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Try
Dim cb As New OleDb.OleDbCommandBuilder(daTraining)
Dim dsNewRow As DataRow
dsNewRow = dsTraining.Tables("Training").NewRow
dsNewRow.Item("ID") = txtTrainingID.Text
dsNewRow.Item("Ranch") = cbRanches.Text
dsNewRow.Item("Location") = txtLocation.Text
dsNewRow.Item("Date") = mtbDate.Text
dsNewRow.Item("StartTime") = mtbStartTime.Text
dsNewRow.Item("FinishTime") = mtbFinishTime.Text
dsNewRow.Item("Crew") = txtCrews.Text
dsNewRow.Item("Supervisor") = txtSupervisor.Text
dsNewRow.Item("Foreperson") = txtForeperson.Text
dsNewRow.Item("Activity") = txtActivity.Text
dsNewRow.Item("Trainer") = txtTrainer.Text
dsNewRow.Item("Topics") = txtTopics.Text
dsTraining.Tables("Training").Rows.Add(dsNewRow)
daTraining.Update(dsTraining, "Training")
MsgBox("Training Recorded")
cb.Dispose()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
在查询和命令生成器中使用带有通配符的数据适配器时,这是一个常见问题。如果一个或多个列名是保留字或包含空格或其他特殊字符,则自动生成的INSERT和UPDATE语句将生成语法错误
首选的解决方案是更改有问题的列名,但如果这不是一个选项,则可以设置命令生成器的
QuotePrefix
和QuoteSuffix
属性,以便它转义生成的操作命令中的所有列名。适当的值因数据库而异,但对于Microsoft数据库,请分别使用“[”和“]”。在查询和命令生成器中使用带有通配符的数据适配器时,这是一个常见问题。如果一个或多个列名是保留字或包含空格或其他特殊字符,则自动生成的INSERT和UPDATE语句将生成语法错误
首选的解决方案是更改有问题的列名,但如果这不是一个选项,则可以设置命令生成器的
QuotePrefix
和QuoteSuffix
属性,以便它转义生成的操作命令中的所有列名。根据您的数据库,相应的值会有所不同,但对于Microsoft数据库,请分别使用“[”和“]”。如注释中所示,问题在
dsNewRow.Item("Date") = mtbDate.Text
由于
Date
是一个保留字。如评论中所示,该问题已解决
dsNewRow.Item("Date") = mtbDate.Text
将
Date
作为保留字。查看daTraining.InsertCommand.CommandText
中的查询。你应该发现它有某种错误。您的dataadapter可以/将保留所有命令,而无需一遍又一遍地重新创建commandbuilder。正如@Proputix所建议的,您不应该每次保存时都创建新的命令生成器。创建用于生成命令的数据适配器后,立即创建单个命令生成器。如果您正在为数据适配器使用成员变量,请也为命令生成器使用成员变量。@FloatingKiwi我该怎么做?我添加了:{MsgBox(daTraining.InsertCommand.CommandText.ToString)},它抛出了一个错误。我在谷歌上搜索了一下,它说我需要编写一个解析器。看看daTraining.InsertCommand.CommandText
中的查询。你应该发现它有某种错误。您的dataadapter可以/将保留所有命令,而无需一遍又一遍地重新创建commandbuilder。正如@Proputix所建议的,您不应该每次保存时都创建新的命令生成器。创建用于生成命令的数据适配器后,立即创建单个命令生成器。如果您正在为数据适配器使用成员变量,请也为命令生成器使用成员变量。@FloatingKiwi我该怎么做?我添加了:{MsgBox(daTraining.InsertCommand.CommandText.ToString)},它抛出了一个错误。我在谷歌上搜索它,它说我需要写一个解析器。不,问题不在那里。那代码没有问题。问题是命令生成器生成的SQL无效,因为它没有转义该列名。有两种方法可以在不更改列名的情况下修复此问题,从而不更改此处显示的代码。虽然更改列名是最好的选择,但是如果您已经指出问题实际上没有问题,您可以不这样做来修复问题。不,问题不存在。那代码没有问题。问题是命令生成器生成的SQL无效,因为它没有转义该列名。有两种方法可以在不更改列名的情况下修复此问题,从而不更改此处显示的代码。虽然更改列名是最好的选择,但如果您已经指出问题实际上没有问题,则可以不进行此操作来修复问题。