用于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
是当你尝试使用它时仍然在范围内。如果一个模块中声明,那么它应该任何Sub
或Function
和之外声明,如果其他模块应该能够访问它,它应该被宣布为Public
Option Explicit
Public cn as ADODB.Connection
Sub foo()
...
。假定cn
仍处于范围,您可以检查cn
引用的对象的State属性,看看Connection
是否仍然打开。
If (cn.State = adStateClosed) Then
' we have a problem
...
核心网连接之前,为了调用存储过程我检查Cn的状态宣布为公共 ,它是开放的。 – Jan 2010-01-11 19:24:13
编辑答案 - 两个连接的连接字符串是不同的,这可能是问题。 – barrowc 2010-01-12 01:09:14
你是对的。 Cn通过两个步骤查找用户名和角色以授予表的权限。第二个连接使用“通用”用户名而不是个人用户名在一个进程中建立直接连接。 老板已同意使用第二个连接。第二次连接的使用不会经常发生,其打开的时间将会很短。 感谢您关注我的问题! – Jan 2010-01-13 14:37:59