我已经在Excel 2007中使用ADO 2.7设置了参数化查询。数据库连接是通过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
答案 0 :(得分:1)
您没有将您创建的参数添加到Command对象:
myQuery.Parameters.Append Parameter
只是创建它不会添加它......