带参数的 SQL 插入适用于 MSAccess,但不适用于 SQL Server

标签 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
            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 模式时遇到的错误是:

Must declare the scalar variable "@mission_id"

由于代码在我连接到 MSAccess 数据库时有效,所以我真的不确定如何为 SQL Server 解决这个问题。我知道我可以连接到 SQL Server,因为其他查询(选择查询)可以工作。我知道插入在我的帐户下工作,因为我能够进行基于字符串的插入。但我在这里犹豫不决。

如果是数据类型问题,为什么错误会与整数字段相关?

最佳答案

System.Data.OleDb 实际上并不支持命名参数。参数是位置,并且必须按照其占位符在命令文本中出现的顺序进行声明。

现在,Access OLEDB 提供程序将容忍命名参数。它将忽略名称并仅按其顺序排列,但对于具有名称的参数(和占位符)不会有问题。

SQL Server 的 OLEDB 提供程序更加挑剔,并且会拒绝您使用的命名参数。所以,对于 SQL Server ...

这将失败并显示您描述的错误消息:

Dim connStr As String
connStr = "Provider=SQLOLEDB;Server=(local)\SQLEXPRESS;Database=myDb;Trusted_Connection=yes"
Using conn As New OleDbConnection(connStr)
    conn.Open()
    Dim sql As String
    sql = "INSERT INTO Clients (LastName, FirstName) VALUES (@LastName, @FirstName)"
    Using cmd As New OleDbCommand(sql, conn)
        cmd.Parameters.AddWithValue("@LastName", "Thompson")
        cmd.Parameters.AddWithValue("@FirstName", "Gord")
        cmd.ExecuteNonQuery()
    End Using
End Using

但是,这会起作用:

Dim connStr As String
connStr = "Provider=SQLOLEDB;Server=(local)\SQLEXPRESS;Database=myDb;Trusted_Connection=yes"
Using conn As New OleDbConnection(connStr)
    conn.Open()
    Dim sql As String
    sql = "INSERT INTO Clients (LastName, FirstName) VALUES (?, ?)"
    Using cmd As New OleDbCommand(sql, conn)
        cmd.Parameters.AddWithValue("?", "Thompson")  ' LastName
        cmd.Parameters.AddWithValue("?", "Gord")  ' FirstName
        cmd.ExecuteNonQuery()
    End Using
End Using

关于带参数的 SQL 插入适用于 MSAccess,但不适用于 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35027955/

相关文章:

sql - 如何加速递归 CTE

sql-server - 是否可以轻松地从树形 View 中的 1000 个存储过程中找到 SQL Server Management Studio 中的一个存储过程?

sql-server - 关于 2 个表之间的 SQL Server 关系的 Noddy 问题。你能澄清一下吗?

mysql - Oracle 与 MySQL 的对比

sql - 如何在 SQL Server 2008 中更改此计算列?

.net - 如何减少 .NET 垃圾收集的频率?

c# - 快速清除以下列表或适当的 .NET 集合的方法

sql-server - SSIS 中的客户端统计信息

java - Hibernate session.createQuery(from TableProcess).list(); 的问题不起作用

.net - 将 HTML 内容格式化为可打印报告