带参数的SQL Insert对于MSAccess可以正常工作,但在SQL Server上不行

带参数的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

我注意到,当连接到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
            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语句,而是用于过程。您需要在常规语句中实际声明变量,而不是使用具有默认数据类型的过程。