用于Oracle语法错误或访问冲突的Microsoft ODBC驱动程序(-2147217900)

问题描述:

我有一个连接到Oracle数据库的大型VB程序。用于Oracle语法错误或访问冲突的Microsoft ODBC驱动程序(-2147217900)

strCn = "Driver={Microsoft ODBC for Oracle};" & _ 
     "SERVER=PSPROD;" 

Set Cn = New ADODB.Connection 
Cn.ConnectionString = strCn 
Cn.CursorLocation = adUseNone 
Cn.Open 

有我的程序的许多用户,所以我有一个包含每个用户的登录名和他们的访问权限的各种表的表。当程序启动时,我创建了所有用户的记录集,然后从记录集中选择USERNAME和GRANTED_ROLE,在这些记录集中找到USERNAME和PASSWORD。我使用“由'password'”statment和Cn.Execute语句标识的“设置角色'GRANTED_ROLE'来设置用户的访问权限。这全部在模块中完成。

在表单上,​​我想调用一个将SELECT,INSERT和UPDATE信息存入另一个模式表的存储过程。我能够调用并运行存储过程,当我创建这个代码与数据库的新连接:

昏暗cmd5040作为ADODB.Command 昏暗conn5040作为ADODB.Connection昏暗 作为param5040 ADODB.Parameter

Set conn5040 =新建ADODB.Connection conn5040 =“Driver = {Microsoft ODBC for Oracle};” & _ “SERVER = PSPROD; UID = XXXXXXX; PWD = XXXXXXXX” conn5040.Open

集cmd5040 =新ADODB.Command

随着cmd5040 .ActiveConnection = conn5040 .CommandType = adCmdStoredProc .CommandText = “S4115040_IMPORT_NEWBIDITEMSPES.S4115040_CheckTime”

.Parameters.Append .CreateParameter(, adInteger, adParamInputOutput, 5) 
.Parameters.Append .CreateParameter(, adVarChar, adParamInputOutput, 400) 

结束随着

cmd5040(0)= 0 cmd5040(1)= “” cmd5040.CommandTimeout = 300

cmd5040.Execute conn5040.Close

然而,我得到的错误消息“-2147217900 [微软] [用于Oracle的ODCB驱动程序]语法错误或访问冲突“当我尝试在程序第一次启动时使用相同的连接('Cn')时。我的代码是:

昏暗cmd5040作为ADODB.Command 昏暗param5040作为ADODB.Parameter

集cmd5040 =新ADODB.Command

随着cmd5040 .ActiveConnection = CN .CommandType = adCmdStoredProc 。的CommandText = “S4115040_IMPORT_NEWBIDITEMSPES.S4115040_CheckTime”

.Parameters.Append .CreateParameter(, adInteger, adParamInputOutput, 5) 
.Parameters.Append .CreateParameter(, adVarChar, adParamInputOutput, 400) 

结束随着

cmd5040(0)= 0 cmd5040(1)= “”

cmd5040.Execute

我与我的DBA工作。她给了我直接资助和直接执行特权,我仍然收到错误信息。

我在做什么错?我应该能够使用原始连接来运行存储过程吗?或者我必须创建第二个连接?

编辑:在审查您的代码时,我注意到原始连接Cn指定了驱动程序和服务器名称,而第二个连接conn5040指定了驱动程序,服务器名称,用户和密码。

因此,它可能是您调用存储过程需要一个用户名和密码对原cn连接不指定


原来的答复:

确保变量cn是当你尝试使用它时仍然在范围内。如果一个模块中声明,那么它应该任何SubFunction和之外声明,如果其他模块应该能够访问它,它应该被宣布为Public

Option Explicit 

Public cn as ADODB.Connection 

Sub foo() 
... 

。假定cn仍处于范围,您可以检查cn引用的对象的State属性,看看Connection是否仍然打开。

If (cn.State = adStateClosed) Then 
    ' we have a problem 
    ... 
+0

核心网连接之前,为了调用存储过程我检查Cn的状态宣布为公共 ,它是开放的。 – Jan 2010-01-11 19:24:13

+0

编辑答案 - 两个连接的连接字符串是不同的,这可能是问题。 – barrowc 2010-01-12 01:09:14

+0

你是对的。 Cn通过两个步骤查找用户名和角色以授予表的权限。第二个连接使用“通用”用户名而不是个人用户名在一个进程中建立直接连接。 老板已同意使用第二个连接。第二次连接的使用不会经常发生,其打开的时间将会很短。 感谢您关注我的问题! – Jan 2010-01-13 14:37:59