300分 求解ADO调用Oracle 存储过程的问题
通过一个ActiveX DLL组件访问Oracle数据库,问题出在通过该组件的接口访问存储过程时。当客户端工程与ActiveX 工程一起编译时,可以顺利的调用存储过程;但当ActiveX 工程编译为DLL,客户端工程单独运行时出现如下错误:
错误号为3001,错误提示:Arguments are of the wrong type,are out of acceptable range,or are in conflict with one another
该DLL组件的其他接口均正常,并且通过如下方式条用存储过程ps_MyProc
也能正常运行:
strSQL = " {call ps_MyProc(1,2)}"
g_objDBAS.Execute strSQL
'g_objDBAS是通过DLL创建的对象,Execute接口执行SQL语句
------------------------------
------------------------------
客户端代码片段如下:
Dim rs As New ADODB.Recordset
Dim cmd As New ADODB.Command
cmd.CommandText = "psTest"
cmd.CommandType = adCmdStoredProc
Dim prmA As New Parameter
Set prmA = cmd.CreateParameter("p_A", adInteger, adParamInput, , 1)
cmd.Parameters.Append prmA
Dim prmB As New Parameter
Set prmB = cmd.CreateParameter("p_B", adInteger, adParamOutput)
cmd.Parameters.Append prmLNZS
g_objDBAS.ExecCmd cmd 'g_objDBAS是通过DLL创建的对象,ExecCmd是其接口
----------------------------------
----------------------------------
ActiveX 组件部分代码如下:
Public Function ExecCmd(cmd As ADODB.Command) As ADODB.Recordset
On Error GoTo PROC_ERROR
'g_Conn 是全局的连接对象
If g_Conn Is Nothing Then
Call openDB
ElseIf g_Conn.State = 0 Then
Call openDB
End If
Dim rs As New ADODB.Recordset
Set cmd.ActiveConnection = g_Conn
Set rs = cmd.Execute()
Set ExecCmd = rs
PROC_EXIT:
Exit Function
PROC_ERROR:
Err.Raise Err.Number, Err.Source, Err.Description
GoTo PROC_EXIT
End Function
———————————————————————————————
其余200分在另外两个帖子中给