VB .NET OleDbCommand 在 SQL 语句末尾返回缺少分号 (;)

Posted

技术标签:

【中文标题】VB .NET OleDbCommand 在 SQL 语句末尾返回缺少分号 (;)【英文标题】:VB .NET OleDbCommand returns Missing semicolon (;) at end of SQL statement 【发布时间】:2012-06-14 21:21:53 【问题描述】:

我正在使用 VB .Net 循环通过正则表达式匹配并生成 sql 语句。我正在创建这样的 sql

sql = "Insert Into Agencies (Address) Values"
While MatchObj.Success
    sql = sql & "(""" & MatchObj.Groups(1).Value & """), "
    MatchObj = MatchObj.NextMatch()
End While
sql = sql.Substring(0, Len(sql) - 2) & ";"

所以当我在创建它后将 sql 打印到即时窗口时,我得到了这个:

Insert Into Agencies (Address) Values(" 1330 W Indian School Rd, "), (" 3323 E Baseline Rd, "), (" 207 N Gilbert Rd, "), (" 3160 S. Gilbert Rd., Ste. 4, ");

然后我使用 sql 语句创建一个 OleDbCommand。我可以连接到数据库,但是当我运行 .ExecuteNonQuery() 时出现此错误:“SQL 语句末尾缺少分号 (;)”

我的目标是使用单个 INSERT 将所有这些值放入数据库列“地址”。

非常感谢任何帮助。

编辑: 这是我用来打开和执行的子程序

Public Sub executeSQL(ByVal sql As String)
        Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Local Projects\AgenciesAZ.mdb'"
        Dim conn As OleDbConnection = New OleDbConnection(connString)
        Dim cmd As OleDbCommand = New OleDbCommand(sql, conn)


        conn.Open()
        cmd.ExecuteNonQuery() 'error hits here
        conn.Close()
End Sub

【问题讨论】:

哪个数据库?你能显示使用的连接字符串和用于将命令发送到数据库的代码吗? 好吧,您知道您的数据库风格是否甚至支持多值insert 语句?某些版本的 SQL Server 支持它,但尽管多次请求此类信息,但您并未提及您正在使用的数据库版本。 “OleDbCommand”没有告诉我们您使用的是什么数据库风格。 我怀疑您正在通过 OleDb 使用 MS-Access。如果是这种情况,那么您不能以这种方式进行多次插入。 现在我们知道了,我用“ms-access”重新标记了这个问题。 假设它是 Microsoft Access。 Look at this question 【参考方案1】:

您需要拆分插入语句,每次您想在地址中插入内容时都必须使用“插入...”,而且如果您只想在 VB 中执行一次,则需要用 分号 (;) 分隔每个语句,它应该可以工作

你需要做这样的事情。

Insert Into Agencies (Address) Values
 (" 1330 W Indian School Rd, ");
 Insert Into Agencies (Address) Values
 (" 3323 E Baseline Rd, ");
 Insert Into Agencies (Address) Values
 (" 207 N Gilbert Rd, ");
 Insert Into Agencies (Address) Values
 (" 3160 S. Gilbert Rd., Ste. 4, ");

编辑

你的时间应该是

While MatchObj.Success
sql = " Insert Into Agencies (Address) Values"

    sql = sql & "(""" & MatchObj.Groups(1).Value & """); "
    MatchObj = MatchObj.NextMatch()
End While

虽然我强烈建议在单独的语句和事务中插入每一个,但这取决于你。


编辑 2

您不能在 MS-Access 中同时插入多条记录,您必须像每次插入一样插入...

Public Sub executeSQL(ByVal sql As String)
        Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Local Projects\AgenciesAZ.mdb'"
        Dim conn As OleDbConnection = New OleDbConnection(connString)
        Dim cmd As OleDbCommand = New OleDbCommand(sql, conn)


        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()
End Sub

 While MatchObj.Success
    sql = " Insert Into Agencies (Address) Values"

        sql = sql & "(""" & MatchObj.Groups(1).Value & """); "
        executeSQL(sql )
        MatchObj = MatchObj.NextMatch()
    End While

【讨论】:

我仍然遇到同样的错误。我不确定我是否完全理解这应该是一个字符串变量。我需要添加换行符吗?也许你可以把它写成这样:sql = "" 谢谢你的快速回复 OP 没有提到数据库是 SQL Server,所以GO 不一定是一个选项。 GO 无论如何都不会在代码中工作,它不是关键字。这只是 SSMS 拆分脚本的一个指标(事实上,如果您愿意,您可以将 GO 更改为 SSMS 选项中的其他内容)。 正确,这不是 sql server 所以我使用的是 OleDbCommand...不是 sqlCommand 那么是哪一个?重新标记您的问题 我认为 SQL 标签是正确的,因为描述说“这个标签是针对一般 SQL 编程问题的;它不是针对 Microsoft SQL Server 的,它本身也不是指特定的 SQL 方言。 "不过我是该网站的新手,所以我可能是错的。

以上是关于VB .NET OleDbCommand 在 SQL 语句末尾返回缺少分号 (;)的主要内容,如果未能解决你的问题,请参考以下文章

VB.Net 和 Access - 获取累加器值

asp.net oledbcommand 返回所有行

从 SQL TVP 创建 VB.NET 数据表的最快方法是啥

范围查询 ~ VB

在 OleDbCommand 的插入语句中指定函数

在参数化的 OleDbCommand 中使用 DateTime 的异常