大家晾凉自己怎么判断远程数据库是否连上的方法!既然是大讨论,那咱们就把VB家族的几个兄弟都讨论了吧!
1.VB6.0里怎么判断SQL是否连上。
2.VBA里怎么判断SQL是否连上。
3.VBS里怎么判断SQL是否连上。
好了,有没有高招就看大家了!
谁的方法最好,分就给谁吧...
vb6.0、vba、vbs分别选个最佳的!欢迎大家踊跃发言

解决方案 »

  1.   

    我猜测db-library可能更快一些,不过还没研究明白这个东东...
      

  2.   

    Public Sub DBConnect()
      '如果连接标记为真,表明数据库已连接,则直接返回。
      If IsConnect = True Then
        Exit Sub
      End If
      
      Set cnn = New ADODB.Connection
      '设置连接字符串的ConnectionString属性
      cnn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=数据库;Data Source=."
      cnn.Open
      '判断连接的状态
      If cnn.State <> adStateOpen Then
        '如果连接不成功,则显示提示信息,退出程序
        MsgBox "数据库连接失败", vbOKOnly + vbCritical, "连接失败"
        End
      End If
      
      '设置连接标记,表示已经连接到数据库
      IsConnect = True
    End Sub
      

  3.   

    connection.state
    State 属性
    对所有适用的对象,指示该对象状态是打开的还是关闭的。指示对所有可应用的对象执行异步方法,指示对象的当前状态是正在连接、正在执行还是正在检索。返回值
    返回可能是 ObjectStateEnum 值的 Long 值。默认值为 adStateClosed。说明
    可以随时用 State 属性确定给定对象的当前状态。对象的 State 属性可以是值的组合。例如,如果正在执行某个语句,此属性将有一个 adStateOpen 和 adStateExecuting 的组合值。State 属性为只读。请参阅
    Visual Basic 范例 | Visual C++ 范例 | Visual J++ 范例适用于:Command 对象 | Connection 对象 | Record 对象 | Recordset 对象 | Stream 对象
      

  4.   

    ConnectionString、ConnectionTimeout 和 State 属性范例 (VB)
    本范例演示使用 ConnectionString 属性打开 Connection 对象的不同方式。范例中还使用 ConnectionTimeout 属性来设置连接超时的时间段,并使用 State 属性来检查连接的状态。运行此过程需要 GetState 函数。'BeginConnectionStringVB    'To integrate this code replace
        'the database, DSN or Data Source values
        
    Public Sub Main()
        On Error GoTo ErrorHandler    Dim Cnxn1 As ADODB.Connection
        Dim Cnxn2 As ADODB.Connection
        Dim Cnxn3 As ADODB.Connection
        Dim Cnxn4 As ADODB.Connection
        
         ' Open a connection without using a Data Source Name (DSN)
        Set Cnxn1 = New ADODB.Connection
        Cnxn1.ConnectionString = "Provider='sqloledb';Data Source='MySqlServer';" & _
            "Initial Catalog='Pubs';Integrated Security='SSPI';"
        Cnxn1.Open
        MsgBox "Cnxn1 state: " & GetState(Cnxn1.State)
        
         ' Open a connection using a DSN and ODBC tags
         ' It is assumed that you have create DSN 'Pubs' with a user name as
         ' 'MyUserId' and password as 'MyPassword'.
        Set Cnxn2 = New ADODB.Connection
        Cnxn2.ConnectionString = "Data Source='Pubs';" & _
            "User ID='MyUserId';Password='MyPassword';"
        Cnxn2.ConnectionTimeout = 30
        Cnxn2.Open
        MsgBox "Cnxn2 state: " & GetState(Cnxn2.State)
        
         ' Open a connection using a DSN and OLE DB tags
         ' It is assumed that you have create DSN 'Pubs1' with windows authentication.
        Set Cnxn3 = New ADODB.Connection
        Cnxn3.ConnectionString = "Data Source='Pubs1';"
        Cnxn3.Open
        MsgBox "Cnxn2 state: " & GetState(Cnxn3.State)
        
         ' Open a connection using a DSN and individual
         ' arguments instead of a connection string
         ' It is assumed that you have create DSN 'Pubs' with a user name as
         ' 'MyUserId' and password as 'MyPassword'.
        Set Cnxn4 = New ADODB.Connection
        Cnxn4.Open "Pubs", "MyUserId", "MyPassword"
        MsgBox "Cnxn4 state: " & GetState(Cnxn4.State)
           
        ' clean up
        Cnxn1.Close
        Cnxn2.Close
        Cnxn3.Close
        Cnxn4.Close
        Set Cnxn1 = Nothing
        Set Cnxn2 = Nothing
        Set Cnxn3 = Nothing
        Set Cnxn4 = Nothing
        Exit Sub
        
    ErrorHandler:
        ' clean up
        If Not Cnxn1 Is Nothing Then
            If Cnxn1.State = adStateOpen Then Cnxn1.Close
        End If
        Set Cnxn1 = Nothing
        
        If Not Cnxn2 Is Nothing Then
            If Cnxn2.State = adStateOpen Then Cnxn2.Close
        End If
        Set Cnxn2 = Nothing
        
        If Not Cnxn3 Is Nothing Then
            If Cnxn3.State = adStateOpen Then Cnxn3.Close
        End If
        Set Cnxn3 = Nothing
        
        If Not Cnxn4 Is Nothing Then
            If Cnxn4.State = adStateOpen Then Cnxn4.Close
        End If
        Set Cnxn4 = Nothing
        
        If Err <> 0 Then
            MsgBox Err.Source & "-->" & Err.Description, , "Error"
        End If
    End SubPublic Function GetState(intState As Integer) As String   Select Case intState
          Case adStateClosed
             GetState = "adStateClosed"
          Case adStateOpen
             GetState = "adStateOpen"
       End SelectEnd Function
    'EndConnectionStringVB
      

  5.   

    db-library 判断login=dblogin();
    DBSETLUSER(login,UserName);
    DBSETLPWD(login,Password);
    DBSETLAPP(login,app_name);需要用到 #define   DBNTWIN32   
      #include   <windows.h>   
      #include   <sqlfront.h>   
      #include   <sqldb.h> 我主要考虑的是 是不是用vc打包个api就是了....理论上说ado就是从这里封装的....
      

  6.   

    我一般这么写
        If Cn.State <> adodb.ObjectStateEnum.adStateClosed Then Cn.Close
        Cn.Open
      

  7.   

    没区别,调用 ADODB.Connection.Open,连不上总是有错误的。
      

  8.   

    当连接成功以后,服务器再断开,此时State是没有改变的吧,所以我认为不能用state属性来判断.
    连接成功以后还是定时向服务器执行一个连接测试用的小存储过程(比如 select 1=1),执行失败则断开了.
      

  9.   

    修正一个 不是 select1=1 而是select i=1
      

  10.   

    vb6
    dim withevents cn as adodb.connection
    ConnectComplete 和 Disconnect事件。没试过。
      

  11.   

    连接成功会有ConnectComplete 事件,但是除非调用close方法,否则不会触发Disconnect事件
      

  12.   

    ado connection对象可能未必是最好的选择这个问题06年的时候就讨论过,我当时提议的就是ado的方式,后来研究了一下, 理论上说用db-library sql server自带库更快一些
      

  13.   

    on error resume -->,哈,是不是,嘿嘿
      

  14.   

    没有人有其他的方法了吗?
    使用普通的方法,都会弹出SQL错误信息框,这个很不友好,谁有没有不弹这个框的方法?就是说所有的操作都在代码里判断...再等几天期待高手了...
      

  15.   

    Dim cn As ADODB.Connection
        Set cn = New ADODB.Connection
        cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb;
        If cn.State = adStateOpen Then
            MsgBox "连接成功!"
        Else
            MsgBox "连接失败!"
        End If
      

  16.   

    SQL Server(通常在远程或局域网)中是这样处理:
    1、先Ping(模块,CSDN上有共享)一下数据库的IP地址,如果通则执行第2步;不通则直接报连接不成功,这 比SQL数据库的反馈要快很多!
    2、连接数据库,捕捉SQL反馈的错误代码<>0则提示连接失败
    3、用Timer定时检测连接,打开一个只有一条记录的表,能打开则说明数据库连接OK,不通则转到 错误捕捉,提示相应的信息
      

  17.   


    Option ExplicitPrivate Sub Form_Load()    Dim WS    '不要Dim WS As Object,因为VBS不支持除变体Variant以外的数据类型    Set WS = CreateObject("mswinsock.winsock")    '不要Dim WS As New winsock,还是照顾VBS^_^    With WS
            .RemoteHost = "192.168.1.188"    '你要测试连接的远程IP
            .RemotePort = 80    '选个常用的端口哦^_^,比如 21、80、135、137、138、139、445、1025、1394、2475、3127、6129、3389、593
        End With    WS.Connect    '空循环,不能写winsock的连接事件,用这个最合适啦!
        Do While WS.State = 6
            DoEvents
        Loop
        'State数据类型
        'Integer    'State 属性的设置值是:
        '常数                    值        描述
        'sckClosed               0      缺省的。关闭
        'sckOpen                 1      打开
        'sckListening            2      侦听
        'sckConnectionPending    3      连接挂起
        'sckResolvingHost        4      识别主机
        'sckHostResolved         5      已识别主机
        'sckConnecting           6      正在连接
        'sckConnected            7      已连接
        'sckClosing              8      同级人员正在关闭连接
        'sckError                9      错误    If WS.State = 7 Then
            '连上的操作
        Else
            '其他情况即没连上该做的
        End IfEnd Sub
      

  18.   

    终于等到了!按照我原先的承诺,只给最佳的回答,但是我不知道这个是不是最好的了...请老马、VB老鸟、雅琪、AisaC、liuxiaoyi666、阿根廷巫师、acmain等等高手综合定吧!明晚根据综合意见来结贴!在我看来,jieweibin的方法是最佳的,而且也是我最近为解决我们公司AutoCAD插件断网双工程切换的解决思路。好吧,我给出我的解决代码,与jieweibin不同的是,我使用的是winsck,哈!
    我给个VB6.0+VBA+VBS通用的方法!(见上贴)
      

  19.   


    '空循环,不能写winsock的连接事件,用这个最合适啦!
        Do While WS.State = 6
            DoEvents
        Loop切不可忘掉DoEvents,否则主线程就睡觉去了...
    空循环变成了死循环了