【问题标题】:Microsoft ODBC driver for Oracle Syntax error or access violation (-2147217900)用于 Oracle 语法错误或访问冲突的 Microsoft ODBC 驱动程序 (-2147217900)
【发布时间】:2011-01-03 02:01:56
【问题描述】:

我有一个连接到 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'标识”语句和Cn.Execute 语句来设置用户的访问权限。这一切都在一个模块中完成。

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

将 cmd5040 调暗为 ADODB.Command 将 conn5040 调暗为 ADODB.Connection 调暗 param5040 As ADODB.Parameter

设置 conn5040 = 新 ADODB.Connection conn5040 = "驱动程序={Microsoft ODBC for Oracle};" &_ “服务器=PSPROD;UID=XXXXXXX;密码=XXXXXXXX” conn5040.打开

设置 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.执行 conn5040.关闭

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

将 cmd5040 调暗为 ADODB.Command 调暗 param5040 As 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.执行

我曾与我的 DBA 合作过。她给了我直接授权和直接执行权限,但我仍然收到错误消息。

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

【问题讨论】:

    标签: odbc syntax-error drivers


    【解决方案1】:

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

    【讨论】:

    • Cn 连接被声明为 Public 就在调用存储过程之前,我检查了 Cn 的状态并且它是打开的。
    • 编辑了答案 - 两个连接的连接字符串不同,这可能是问题所在。
    • 你是对的。 Cn 以某种方式在查找用户名及其角色以授予表权限的两步过程中建立连接。第二个连接在一个进程中使用“通用”用户名而不是个人用户名进行直接连接。 Boss 已同意使用第二个连接。第二个连接的使用不会很频繁,打开的时间会很短。感谢您关注我的问题!!
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多