VB6:在adodb.Connection对象上调用.Open时出错(适用于特定上下文)

VB6:在adodb.Connection对象上调用.Open时出错(适用于特定上下文),vb6,odbc,Vb6,Odbc,我目前正在使用小尺寸的旧VB6应用程序 我的问题是:当用户单击按钮时,程序正在打开与Oracle数据库的连接。这在从IDE运行或在Windows 95或Windows 98兼容模式下运行.exe时效果良好,否则会崩溃。 它可以在另一台工作站上工作,但我不知道为什么(不同的配置,但我不知道可能是什么!) 以下是按下按钮时调用的代码(它在另一个没有兼容性设置但可能有其他一些配置差异的工作站上工作)。 大部分代码与连接无关,但为了完整起见,我将其保留原样 Private Sub Form_Load()

我目前正在使用小尺寸的旧VB6应用程序

我的问题是:当用户单击按钮时,程序正在打开与Oracle数据库的连接。这在从IDE运行或在Windows 95或Windows 98兼容模式下运行.exe时效果良好,否则会崩溃。 它可以在另一台工作站上工作,但我不知道为什么(不同的配置,但我不知道可能是什么!)

以下是按下按钮时调用的代码(它在另一个没有兼容性设置但可能有其他一些配置差异的工作站上工作)。 大部分代码与连接无关,但为了完整起见,我将其保留原样

Private Sub Form_Load()
'
'   Loads the list of printers (as defined in a table of the SQL DB)
'
    On Error GoTo error_handler

    '   icon
    Screen.MousePointer = vbHourglass


    'Dim conn As New adodb.Connection
    'Dim cmd As New adodb.Command
    'Dim rcs As New adodb.Recordset
    Dim conn As adodb.Connection
    Dim cmd As adodb.Command
    Dim rcs As adodb.Recordset

    Set conn = New adodb.Connection
    Set cmd = New adodb.Command
    Set rcs = New adodb.Recordset

    'Dim fs As New FileSystemObject
    Dim fs As FileSystemObject
    Set fs = New FileSystemObject
    Dim fic As File
    Dim texte As textStream
    Dim req As String


    Dim i As Integer
    Dim chem As Variant

    Dim buffer As String
    Dim retstring As String
    Dim rc As Long

    If fs.FileExists(Appli_Rep & "Queries\System\printers_list.txt") Then
        Set fic = fs.GetFile(Appli_Rep & "Queries\System\printers_list.txt")
        Set texte = fic.OpenAsTextStream(ForReading)
    End If


    '
    '   Reads connection string
    '
    buffer = String(145, " ")
    rc = GetPrivateProfileString("Requete", "DRIVER", "1", buffer, Len(buffer) - 1, Appli_Rep & "suivi__.ini")
    DoEvents
    retstring = Left(buffer, InStr(buffer, Chr(0)) - 1)

    '
    '   Gets the PATH environment variable
    '   So that we know where to find tnsname.ora
    '
    i = 0
    chem = Split(Environ("TNS_ADMIN"), ";")
    Do
        If Len(Dir(chem(i) & "\Tnsnames.ora")) <> 0 Then
            ChDrive chem(i)
            ChDir chem(i)
            Exit Do
        End If
        i = i + 1
        DoEvents
    Loop Until i > UBound(chem)


    ' Opens a connection (no DSN)

    'Set conn = New adodb.Connection
    conn.ConnectionString = "uid=_uid;pwd=_pwd;DRIVER=" & retstring & ";server=__PROD;"
    'conn.ConnectionTimeout = 30
    conn.ConnectionTimeout = 3000    ' (no change)

    conn.Open   ' -2147467259 [Microsoft][ODBC driver for Oracle][Oracle]ORA-06413: Connexion non ouverte
        ' Connexion non ouverte = french for "connection is closed".

    Set cmd.ActiveConnection = conn

    cmd.CommandText = texte.ReadAll

    DoEvents

    Set texte = Nothing
    Set fic = Nothing
    Set fs = Nothing

    Set rcs = cmd.Execute

    DoEvents

    rcs.MoveFirst

    Do
        Me.cbo_Imprimantes.AddItem (rcs.Fields("IMPRIMANTE").Value)
        rcs.MoveNext
        DoEvents
    Loop Until rcs.EOF

    '   Close connections / free objects
    Set rcs = Nothing
    Set cmd = Nothing
    If conn.State = 1 Then
        conn.Close
    End If
    Set conn = Nothing

    '   icon back to normal
    Screen.MousePointer = vbDefault

    Exit Sub

error_handler:

    '   retour normal
    Screen.MousePointer = vbDefault

    If Err.Number <> 0 Then
        MsgBox Err.Number & " " & Err.Description, vbCritical + vbOKOnly, "Erreur !!!"
        MsgBox Err.Source
    End If

    On Error Resume Next
    '   Fermeture des objets
    Set rcs = Nothing
    Set cmd = Nothing
    Set conn = Nothing
    Set texte = Nothing
    Set fic = Nothing
    Set fs = Nothing



End Sub
Private子表单_Load()
'
'加载打印机列表(在SQL DB的表中定义)
'
关于错误转到错误处理程序
'图标
Screen.MousePointer=vbHourglass
'作为新adodb.连接的Dim conn
'Dim cmd作为新的adodb.Command
'将rcs设置为新的adodb.Recordset
Dim conn作为adodb连接
Dim cmd作为adodb.Command
将rcs设置为adodb.Recordset
Set conn=新的adodb.连接
Set cmd=New adodb.Command
Set rcs=New adodb.Recordset
'Dim fs作为新的FileSystemObject
将fs设置为文件系统对象
Set fs=New FileSystemObject
以文件形式显示
将文本设置为文本流
Dim req作为字符串
作为整数的Dim i
Dim-chem作为变体
将缓冲区设置为字符串
将字符串变暗为字符串
如长
如果存在fs.files(Appli\u Rep&“querys\System\printers\u list.txt”),则
设置fic=fs.GetFile(Appli\u Rep&“querys\System\printers\u list.txt”)
设置texte=fic.OpenAsTextStream(用于读取)
如果结束
'
'读取连接字符串
'
缓冲区=字符串(145,“”)
rc=GetPrivateProfileString(“请求”、“驱动程序”、“1”、缓冲区、Len(缓冲区)-1、应用程序代表和“suivi_uuuuuuuuuuuuu.ini”)
多芬特
retstring=Left(缓冲区,仪表(缓冲区,Chr(0))-1)
'
'获取PATH环境变量
“这样我们就知道在哪里可以找到tnsname.ora
'
i=0
化学=拆分(环境(“TNS_管理”),“;”)
做
如果Len(Dir(chem(i)和“\Tnsnames.ora”))为0,则
ChDrive化学(一)
ChDir化学(一)
退出Do
如果结束
i=i+1
多芬特
循环,直到i>UBound(化学)
'打开连接(无DSN)
'设置连接=新的adodb.连接
conn.ConnectionString=“uid=\u uid;pwd=\u pwd;DRIVER=”&retstring&“server=\uu PROD;”
'连接超时=30
conn.ConnectionTimeout=3000'(无变化)
conn.Open'-2147467259[Microsoft][Oracle的ODBC驱动程序][Oracle]ORA-06413:Connexion non ouverte
'Connexion non ouverte=法语,表示“连接已关闭”。
设置cmd.ActiveConnection=conn
cmd.CommandText=texte.ReadAll
多芬特
设置text=Nothing
设置为“无”
设置fs=Nothing
设置rcs=cmd.Execute
多芬特
首先,移动
做
Me.cbo_Imprimantes.AddItem(rcs.字段(“IMPRIMANTE”).值)
rcs.MoveNext
多芬特
循环到rcs.EOF
'关闭连接/释放对象
设置rcs=无
Set cmd=Nothing
如果连接状态=1,则
关闭连接
如果结束
设置连接=无
'图标恢复正常
Screen.MousePointer=vbDefault
出口接头
错误\u处理程序:
“恢复正常
Screen.MousePointer=vbDefault
如果错误号为0,则
MsgBox Err.Number&&“Err.Description”,vbCritical+vbOKOnly,“Erreur!!!”
MsgBox错误源
如果结束
出错时继续下一步
“物体的温度
设置rcs=无
Set cmd=Nothing
设置连接=无
设置text=Nothing
设置为“无”
设置fs=Nothing
端接头
它在“conn.Open”声明中崩溃。 连接字符串在这两种情况下都是相同的(我在消息框中显示了它,以确保“retstring”有效)


谢谢您的时间。

崩溃发生时是否返回或记录了任何错误信息?错误管理器会捕获该错误:MsgBox Err.Number&“&Err.Description,vbCritical+vbOKOnly,“Erreur!!!”。这将显示一个消息框,其中包含我作为注释添加到代码中的信息:-2147467259[Microsoft][ODBC driver for Oracle][Oracle]ORA-06413:Connexion non ouverte。我还没有检查ODBC日志,我会试试看;您可以尝试使用Oracle数据库的查询分析器或具有这些凭据的类似工具连接到Oracle数据库,并查看它是否允许该用户登录。您还可以查看上的Oracle部分,查看字符串本身是否需要更新或是否缺少任何信息。100%确定凭据有效(因为它在IDE中执行时有效,我整天都在使用这些凭据)。现在,我将检查连接字符串(不会损坏)和日志,谢谢。好的,我已经找到了问题的根源(但不是完整的解释)。我在谷歌上搜索了sqlnet.log文件中的一些细节,并找到了这个主题,它暗示.exe路径中的括号是罪魁祸首。我的文件夹包含括号“(”和“)”。删除括号后,一切正常。如果有人碰巧有更“深入”的解释,我仍然很感兴趣。