在ADO中对Oracle进行参数化查询会导致Excel崩溃

时间:2011-08-17 15:51:58

标签: oracle excel vba odbc ado

我已经在Excel 2007中使用ADO 2.7设置了参数化查询。数据库连接是通过ODBC完成的,每次执行查询的尝试都会导致Excel崩溃...当我说'崩溃'时,我的意思是必须关闭并重新启动!

起初我认为这是一个问题,我的查询太长(涉及多个参数);但我尝试了一个非常基本的,单个参数,查询并遇到了同样的问题......这是使用位置/未命名的参数,所以也许这就是问题;但是我不确定我是否可以在Oracle查询中使用命名参数,除非我将它包装在模式中的存储函数中。

我的代码,它的价值是什么:

打开数据库DBConnection是包含DSNUsernamexPasswordKey成员的自定义类型,密码以基本加密方式存储在内存中;有一个相应的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 个答案:

答案 0 :(得分:1)

您没有将您创建的参数添加到Command对象:

myQuery.Parameters.Append Parameter 

只是创建它不会添加它......