Параметризованный запрос к Oracle в ADO завершает работу Excel - PullRequest
0 голосов
/ 17 августа 2011

Я настроил параметризованный запрос, используя ADO 2.7 в Excel 2007. Соединение с базой данных выполняется через ODBC, и каждая попытка выполнить запрос приводит к сбою Excel ... и когда я говорю "сбой", я имею в виду это должен закрыть и перезапустить!

Сначала я подумал, что это проблема из-за того, что мой запрос слишком длинный (включает несколько параметров); но я пробовал очень простой, одиночный параметр, запрос и имел ту же проблему ... Это использует позиционные / безымянные параметры, так что, возможно, это проблема; но я не уверен, что смогу использовать именованные параметры с запросом Oracle, если не заключу их в хранимую функцию в схеме.

Мой код, за что он стоит:

Открыть базу данных (DBConnection - это пользовательский тип с элементами DSN, Username, xPassword и Key, пароль хранится в памяти с элементарным шифрованием; имеется соответствующая dbClose функция, которую я здесь опускаю.)

Private Function dbOpen(ByRef db As ADODB.Connection, Creds As DBConnection) As Boolean
    On Error Resume Next

    Set db = New ADODB.Connection
    db.Open Creds.DSN, Creds.Username, XorC(Creds.xPassword, Creds.Key)

    If db.State <> adStateOpen Then dbOpen = False Else dbOpen = True
End Function

Получить данные (упрощенно, с одним параметром, для примера.)

Public Function GetData(ODBC As DBConnection, myParam As String) As ADODB.Recordset
    Dim myDB As ADODB.Connection
    Dim myQuery As ADODB.Command
    Dim Parameter As ADODB.Parameter

    Set myDB = New ADODB.Connection

    If dbOpen(myDB, ODBC) Then
        Set myQuery = New ADODB.Command
        myQuery.ActiveConnection = myDB
        myQuery.CommandText = "select * from sometable where id = ?"

        Set Parameter = myQuery.CreateParameter(, adVarChar, adParamInput, 5, myParam)

        Set GetData = myQuery.Execute

        dbClose myDB
    Else
        MsgBox "Cannot connect to the database.", vbExclamation
        Set GetData = Nothing
    End If
End Function

Процедура тестирования, которая приведет к сбою Excel

Public Sub Test()
    Dim Connection As DBConnection
    Dim myData As ADODB.Recordset

    With Connection
        .DSN = "myDSN"
        .Username = "dbUser"
        .Key = Now
        .xPassword = XorC("p4s5w0rd", .Key)
    End With

    Set myData = GetData(Connection, "AB123")  ' Crashes here
    dbClose myData
End Sub

1 Ответ

1 голос
/ 17 августа 2011

Вы не добавляете созданный вами параметр в объект Command:

myQuery.Parameters.Append Parameter 

Простое создание не добавляет его ...

...