0

我正在使用 MySQL ODBC 5.1 驱动程序在 Excel 中的 VBA 中工作,并且在尝试使用参数化 SQL 查询将行插入表中时遇到问题。在参数化之前,查询运行良好,但我遇到了 SQL 注入问题,其中一列中有包含 SQL 代码的注释,并将插入全部搞砸了。我现在正在转向参数化的最佳实践,但我似乎无法找出我在下面的代码中做错了什么以及为什么它给了我“'字段列表'中的“未知列'p1'”错误。

For y = 0 To 20000
        qry = "INSERT INTO ticket_system.ticket_weekly_snapshot (issue_type,key_name,summary,assignee,reporter,priority,status,resolution,created,updated,due_date,project,linked_issues,parent_link,epic_link,parent_undefined,label,comment) VALUES ("
        Dim adoCmd As Object
        Dim adoRS As Object
        Set adoCmd = CreateObject("ADODB.Command")
        With adoCmd
            .ActiveConnection = cnn
            .CommandType = adCmdText
            If alltix.Range("A2").Offset(y, 0) = "" Then
                Exit For
            End If
            For x = 0 To 17
                Dim l As Integer
                l = Len(alltix.Range("A2").Offset(y, x))
                If l = 0 Then
                    l = 10
                End If
                .Parameters.Append .CreateParameter("p" & x + 1, adLongVarChar, adParamInput, l, alltix.Range("A2").Offset(y, x))
                If x = 17 Then
                    qry = qry & "p" & x + 1 & ")"
                Else
                    qry = qry & "p" & x + 1 & ","
                End If
            Next x
        End With
        adoCmd.CommandText = qry
        Set adoRS = adoCmd.Execute

我目前有一个用于测试的消息框提示,显示查询正在正确构建,以“VALUES (p1, p2, ... p18)”结尾,这就是我迄今为止看到的几乎所有参数化查询的工作方式。所有参数都正确添加到 adoCmd,没有值错误或类似的东西。adoCmd 执行时,最后一行出现“字段列表中的未知列”错误。谁能帮助我并告诉我我哪里出错了?

4

1 回答 1

1

动态构建参数名称对我有用,但可以尝试未命名参数的选项。在循环外声明l变量。真的应该在程序顶部声明所有变量。

qry = "INSERT INTO ticket_system.ticket_weekly_snapshot " & _
      "(issue_type,key_name,summary,assignee,reporter,priority,status,resolution,created,updated,due_date,project,linked_issues,parent_link,epic_link,parent_undefined,label,comment) " & _
      "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
...
Dim l As Integer
For x = 0 To 17
    l = Len(alltix.Range("A2").Offset(y, x))
    If l = 0 Then
        l = 10
    End If
    .Parameters.Append .CreateParameter(, adLongVarChar, adParamInput, l, alltix.Range("A2").Offset(y, x))
Next

有关详细信息,请查看如何在 Microsoft Access 的不同上下文中使用 VBA 中的参数?

于 2021-08-30T20:35:13.773 回答