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 语句末尾返回缺少分号 (;)的主要内容,如果未能解决你的问题,请参考以下文章