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

时间:2010-01-08 20:32:27

标签: odbc syntax-error drivers

我有一个连接Oracle数据库的大型VB程序。

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

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

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

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

Dim cmd5040作为ADODB.Command   Dim conn5040作为ADODB.Connection   Dim param5040作为ADODB.Parameter

设置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

但是,当我在程序首次启动时尝试使用相同的连接('Cn')时,我收到错误消息“-2147217900 [Microsoft] [Oracle的ODCB驱动程序]语法错误或访问冲突”。我的代码是:

Dim cmd5040作为ADODB.Command   Dim 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一起工作过。她给了我直接拨款和直接执行权限,我仍然收到错误信息。

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

1 个答案:

答案 0 :(得分:0)

编辑:在审核您的代码时,我注意到原始连接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
    ...