【问题标题】:SQL Insert with parameters works fine for MSAccess but not on SQL Server带参数的 SQL 插入适用于 MSAccess,但不适用于 SQL Server
【发布时间】:2016-01-27 02:50:22
【问题描述】:

我注意到以下二进制数据插入在连接到 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_id”

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

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

【问题讨论】:

  • 正如错误消息所暗示的,在未使用 DECLARE 语句声明的脚本中使用了一个局部变量。
  • 这不是数据类型问题,只是您尝试将某些东西作为参数传递,而实际上它不是参数(就 SQL Server 而言)。参数不用于常规的 SELECT/INSERT/etc 语句,它们用于过程。您需要在常规语句中实际声明变量(而不是使用具有默认数据类型的过程)。

标签: sql .net sql-server vb.net ms-access


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 2017-03-04
    • 2018-12-27
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多