带参数的SQL Insert对于MSAccess可以正常工作,但在SQL Server上不行
我注意到,当连接到MSAccess 2010时,下面插入的二进制数据可以正常工作,但是当连接到SQL Server Express 2012时,我遇到了一个错误。代码如下:带参数的SQL Insert对于MSAccess可以正常工作,但在SQL Server上不行,sql,.net,sql-server,vb.net,ms-access,Sql,.net,Sql Server,Vb.net,Ms Access,我注意到,当连接到MSAccess 2010时,下面插入的二进制数据可以正常工作,但是当连接到SQL Server Express 2012时,我遇到了一个错误。代码如下: Public Shared Sub InsertBlobs(ByRef hash As Hashtable) Dim constring As String Select Case CONNECTION_TYPE Case DBConnection.MS_Access07
Public Shared Sub InsertBlobs(ByRef hash As Hashtable)
Dim constring As String
Select Case CONNECTION_TYPE
Case DBConnection.MS_Access07
constring = "Provider=Microsoft.Ace.OLEDB.12.0;" & _
"User ID=Admin;" & _
"Data Source=" & ACCESS07_CONNECTION_STRING & ";" & _
"Mode=Read|Write;Extended Properties="""";Jet OLEDB:System Database="""";" & _
"Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;" & _
"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;" & _
"Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;" & _
"Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;" & _
"Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False"
Case DBConnection.MS_SQL
constring = "Provider=SQLOLEDB;" & getSQLConnectionString()
End Select
Try
Using myconnection As New OleDbConnection(constring)
myconnection.Open()
Dim sqlQry As String = "INSERT INTO [UAV_Archive] ([mission_id], [vehicle_plan_gzip], [msn_header]) VALUES " & _
"(@mission_id, @vehicle_plan_gzip, @msn_header)"
Using cmd As New OleDbCommand(sqlQry, myconnection)
cmd.Parameters.AddWithValue("@mission_id", CInt(hash.Item("mission_id")))
cmd.Parameters.AddWithValue("@vehicle_plan_gzip", CType(hash.Item("vehicle_plan_gzip"), Byte()))
cmd.Parameters.AddWithValue("@msn_header", CType(hash.Item("msn_header"), Byte()))
cmd.ExecuteNonQuery()
End Using
End Using
Catch ex As Exception
Dim debugBreakHere As Integer = 0
End Try
End Sub
当我处于SQL Server模式时,我得到的错误是:
必须声明标量变量@mission\u id
由于该代码在连接到MSAccess数据库时有效,因此我真的不确定如何为SQL Server解决此问题。我知道我可以连接到SQL Server,因为其他查询选择查询可以工作。我知道insert在我的帐户下工作,因为我能够执行基于字符串的插入。但我在这里步履蹒跚
如果是数据类型问题,为什么错误会与整数字段相关 System.Data.OleDb实际上不支持命名参数。参数是位置参数,必须按照其占位符在命令文本中的显示顺序进行声明
现在,访问OLEDB提供程序将允许命名参数。它将忽略这些名称,只按它们的顺序进行操作,但参数和占位符有名称并没有问题
SQL Server的OLEDB提供程序比较繁琐,在使用命名参数时会拒绝它们。所以,对于SQL Server
此操作将失败,并显示您描述的错误消息:
Dim connStr As字符串
connStr=Provider=SQLOLEDB;Server=local\SQLEXPRESS;数据库=myDb;可信连接=是
将conn用作新的OleDbConnectionconnStr
康涅狄格州公开赛
将sql设置为字符串
sql=将LastName、FirstName值@LastName、@FirstName插入客户端
使用cmd作为新的OleDbCommandsql,conn
cmd.Parameters。AddWithValue@LastName,汤普森
cmd.Parameters。AddWithValue@FirstName,Gord
cmd.ExecuteNonQuery
终端使用
终端使用
但是,这将起作用:
Dim connStr As字符串
connStr=Provider=SQLOLEDB;Server=local\SQLEXPRESS;数据库=myDb;可信连接=是
将conn用作新的OleDbConnectionconnStr
康涅狄格州公开赛
将sql设置为字符串
sql=插入到客户端的LastName、FirstName值?
使用cmd作为新的OleDbCommandsql,conn
cmd.Parameters.AddWithValue?,Thompson的姓氏
cmd.Parameters.AddWithValue?,Gord'FirstName
cmd.ExecuteNonQuery
终端使用
终端使用
正如错误消息所示,在未使用DECLARE语句声明的脚本中使用了局部变量。这不是数据类型问题,只是您试图将某个对象作为参数传递,而SQL Server实际上并不是参数。参数不用于常规的SELECT/INSERT/etc语句,而是用于过程。您需要在常规语句中实际声明变量,而不是使用具有默认数据类型的过程。