Я настроил параметризованный запрос, используя 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