Проблема добавления строкового параметра в команду ADODB - PullRequest
0 голосов
/ 07 декабря 2018

У меня проблемы с добавлением строкового параметра к объекту команды в VBA.Мой код будет работать для всех нестроковых типов данных в моей книге Excel, но выдает следующий текст ошибки при попытке добавить строковое значение к параметру команды:

"Транзакция не может иметь несколько наборов записей с этим типом курсора. Измените тип курсора, зафиксируйте транзакцию или закройте один из наборов записей. "

Этот код будет успешно выполнен, если я использую команду" Usage_ID "и закомментирую команду" Location ".Почему это?Почему использование строки приводит к сбою?

Я вставляю данные в базу данных Redshift, и столбцы таблицы настроены на использование того же типа данных VARCHAR (256), который я использую в запросениже.

Public Sub newInsert()
    Dim firstRow As Long
    Dim lastRow As Long
    Dim currentRow As Long
    Dim sh As Worksheet

    Set sh = ThisWorkbook.Worksheets("Sheet1")
    firstRow = 5
    lastRow = 5 '##Just using one row for the test##

    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    conn.Open '##using a DSN file here##

    On Error GoTo CleanFail
    conn.BeginTrans

    Dim sql As String
    '## This is the full query I want to execute, 
    '   but it hangs, so I am running with one parameter
    '   at a time for testing. Usage_ID will run with the code below, but 
    '   not location. ##
    'sql = "INSERT INTO new_regions.bw_test (usage_id, location) " _
        '& "VALUES (?, ?)"

    sql = "INSERT INTO new_regions.bw_test (location) " _
         & "VALUES (?)"

    For currentRow = firstRow To lastRow
        Set cmd = New ADODB.Command
        Set cmd.ActiveConnection = conn
        cmd.CommandType = adCmdText
        cmd.CommandText = sql

        ' ## The first one will run successfully, not the second ##    
        'cmd.Parameters.Append cmd.CreateParameter("usage_id", adBigInt, adParamInput, , sh.Cells(1, "Q").value)
        cmd.Parameters.Append cmd.CreateParameter("location", adVarChar, adParamInput, 256, "test")

        cmd.Execute

    Next

    conn.CommitTrans

CleanExit:
    conn.Close
    Exit Sub

CleanFail:
    conn.RollbackTrans
    MsgBox Err.Description & vbNewLine & "Transaction was rolled back, no changes were made", vbExclamation
    Resume CleanExit

End Sub
...