Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
INSERT INTO语句vb.net和access数据库中出现语法错误_Vb.net_Ms Access - Fatal编程技术网

INSERT INTO语句vb.net和access数据库中出现语法错误

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

我正在编写的程序(在vb.net中)应该是将文本框中的值加载到数据库中。 然而,当我点击“保存”时,一开始什么也没发生。没有错误,没有通知,什么都没有。所以我使用断点跟踪它,它得到:

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无效,因为它没有转义该列名。有两种方法可以在不更改列名的情况下修复此问题,从而不更改此处显示的代码。虽然更改列名是最好的选择,但如果您已经指出问题实际上没有问题,则可以不进行此操作来修复问题。