程序启动时建立数据库连接,如果在使用中网络异常中断,如何在网络恢复后不退出程序的情况下重新建立网络连接?

解决方案 »

  1.   

    Public gsOdbcName As String 
    Public ADOsdb As new ADODB.Connection    gsOdbcName = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" _
            & app.path & "\db.mdb" & ";"
        
    With ADOsdb
            If .State <> adStateOpen Then
                .CursorLocation = adUseClient
                .ConnectionString = gsOdbcName
                .Open
            End If
    End With
      

  2.   

    不知楼上两位所说的方式是否经过模拟环境的测试。如果测试通过的请告诉我测试的环境。我现在就是这样做的,但实际情况是,在调试时,这样做没有问题;但在程序运行时,一旦网络中断,当你再去手动恢复数据库连接时,即使网络处于物理中断状态下,程序依旧顺利的执行完cn.open ,而在逻辑上,这是不可能的! 很困扰啊!
      

  3.   

    不是吧,与服务断开网络还可以运行Cn.open??
    如lcsfxs() 所说,只要在每次要进行交互前检查一下与cn与服务器的连接状态。
      

  4.   

    你在访问connection的时候检查其状态就可以了。如:
    Public gCnn     As New ConnectionPublic Sub OpenConnection()
        
        If gCnn.State <> adStateOpen Then
            gCnn.CursorLocation = adUseClient
            gCnn.Open ConnectionString
        End If
        
    End SubPrivate Sub Command1_Click()
        
        OpenConnection
        gCnn.Execute "select..."
        
    End Sub
      

  5.   

    没有太大意义,如果你真的想实现这个过程,那你的程序中将有无数的on error goto ....个人认为如果网络中断一定有其原因,一时半会怕也很难恢复,所以这样做的意义不大。
      

  6.   

    物理中断了,肯定不能正常open,会抱错
    你看是不是在程序中把错误屏蔽了
      

  7.   

    我这几天也遇到这个问题。。不过对方是设备关闭我的办法是,如果OPEN出错,则PING 一下。。不通,做个标志。TIMER循环PING,什么时候PING通了,再OPEN。。
      

  8.   

    这里我感觉还有个问题。open的时候正常了,但是在运行过程中网络中断(我没有在每次执行SQL语句之前都先con.open,感觉太影响速度),con.state是否能检测出一个正确状态(我感觉好象不行,con.state只是说你打开的那个时刻正常),这样的话,一旦执行rec.open strSQL,con 就会出错请大家指点
      

  9.   

    我连的SQL数据库,通过VPN拨号连接,具体操作是:把连接数据库的操作作为一个过程--cnn,程序启动时调用它,然后在mdi界面上用一个timer定时检查数据库连接状态(我是打开一个只有2条记录的测试空表,这样也不会影响速度)---如果打不开表就通过错误捕捉返回错误,然后弹出一个是否重新连接的提示框Sub cnn()
        On Error GoTo sqlerr1
        Dim strCnn As String  '数据库连接字符串
        strCnn = "Provider=SQLOLEDB.1;Password=;Persist Security Info=false;User    ID=sa;Initial Catalog=数据库名;Data Source=服务器IP地址"
        Set cnn1 = New ADODB.Connection
        cnn1.CursorLocation = adUseClient
        cnn1.Open strCnnsqlerr1:
        If Err.Number <> 0 Then   
           MsgBox "数据库连接失败,程序将关闭!请注意以下几点:" & vbCrLf & vbCrLf & "1、本机和数据库服务器联网中断(可能VPN未连接)" _
           & vbCrLf & "2、SQL数据库IP地址或机器名设置不正确" & vbCrLf & "3、SQL服务器管理器没有启动服务", 16, "错误:" & Err.Number  
           End    
       End IfEnd SubPrivate Sub Timer1_Timer()
        On Error GoTo err1
        dim rs1 as new adodb.recordset
        Set rs1 = New ADODB.Recordset    rs1.open "test",cnn1, adOpenDynamic, adLockOptimistic  '打开测试表test
        
    err1:
        If Err.Number <> 0 Then
           Timer2.Enabled = False                         '停止数据库状态刷新
           x = MsgBox("数据库连接中断,重试连接?(Y/N)", vbYesNo, "提示")
           If x = 6 Then
              cnn  '重新连接数据库
            Else
               Exit Sub
            End If    End IfEnd Sub
      

  10.   

    我的程序昨天出问题了~~查了日志发现,设备3小时内4次关闭/打开。。然后SQL语句执行部分全部出错。不行先PING一下吧~~Private Sub tmrPING_Timer()
                Call Ping(recIp.Fields("SHeadlamp"), ECHO)'检测网络状态
                
                If 0 <> ECHO.status Then
                    imgSHeadlampNetState.Picture = LoadPicture(App.Path + "\red.bmp")
                    txtSHeadLampErrMSG.Text = Format(Time, "hh:mm:ss") & "网络故障" & recIp.Fields("SHeadlamp")
                    
                    If g_bolSHeadlampPING Then     '在中断的时候写一次日志
                        Call WriteErrToFile(g_strErrPath & Format(Date, "yyyy-mm-dd") & ".txt", "网络故障!")
                    End If
                    
                    g_bolSHeadlampPING = False
                Else
                    
                    If Not g_bolSHeadlampPING Then    '网络恢复
                        Call WriteErrToFile(g_strErrPath & Format(Date, "yyyy-mm-dd") & ".txt", "网络恢复!")
                    End If
                    
                    g_bolSHeadlampPING = True
                    imgSHeadlampNetState.Picture = LoadPicture(App.Path + "\green.bmp")
        '            txtSHeadLampErrMSG.Text = ""
                    Call CloseREC(recLocationS)          '关闭rec
                    Set recLocationS = New ADODB.Recordset
                    recLocationS.CursorLocation = adUseClient
                    recLocationS.LockType = adLockOptimistic
                    recLocationS.Open "select * from [parameters]", conLocation
                    Call CollecteSHeadlampData(recLocationS.Fields("vin"), _
                            recLocationS.Fields("date"), _
                            recLocationS.Fields("time"), _
                            "S_Line")            '数据库操作
                End If
      

  11.   

    晕不是最新的,我从帖一下                If Not g_bolSHeadlampPING Then    '网络恢复
                        Call WriteErrToFile(g_strErrPath & Format(Date, "yyyy-mm-dd") & ".txt", "网络恢复!")
                    '***************这里加OPEN代码                '*****************************
                    End If我也不知道这个办法行不行。还有就是,OPEN之前我用了Shell("net use \\149.240.36.161 " & """eab""" & " /user:administrator")