前阶段时间发帖没有得到答案,继续发帖:问题请见:
http://community.csdn.net/Expert/TopicView3.asp?id=5731136

解决方案 »

  1.   

    远程数据服务用法    
        当在客户端的 Connection 对象上使用 Open 方法时,在 Connection 对象上打开 Recordset 之前 Open 方法其实并未建立到服务器的连接。摘自:<<ADO程序员参考>>
      

  2.   

    TO:shanhqk(山)重新将网络打开,重连后,执行数据库操作失败,错误为:无效的连接,这是怎么加事呢?
      

  3.   

    重新将网络打开,重连后,必须sleep(3000)才能重连成功,否则执行数据库操作失败,错误为:无效的连接,这是怎么回事呢?(时间应该耗在ConnectPtr::Close()函数)
    如果将数据库访问对象作为全部变量,在CXXXXApp类中建立连接,然后再在其他线程中用,网络断开后,连接不成功,网络重新打开后,能建立有效连接。我查看了Microsoft的文档,当接口指针跨线程传递时会自动产生代理。自动进行跨套间操作:
    In general, the marshaling is accomplished automatically by COM. For example, when passing an interface pointer as a parameter in a method call on a proxy to an object in another apartment, or when calling CoCreateInstance, COM does the marshaling automatically. However, in some special cases, where the application writer is passing interface pointers between apartments without using the normal COM mechanisms, the writer must handle the marshaling manually.http://msdn2.microsoft.com/en-us/library/ms680112.aspx
      

  4.   

    可以在尝试
    1.重新将网络打开,不要立刻重新连接,等待一段时间,然后在重新连接.
    2.现在的关键问题:connectPtr会自动关闭吗?这个我不是很明白.
    3.也可以尝试把timeout的值设置为0,然后再测试,看还会中断吗?
      

  5.   


    TO shanhqk(山)1、是程序在重新连接前,调用了ConnectionPtr::Close()不是自动关闭的。
    2、将连接的timeout设置为0,还是需要Sleep()三秒钟才能调用ConnectionPtr::Open建立有效连接。
      

  6.   

    这里的物理链路中断是说以下两种情况,和通常所说的网络的物理连接中断不完全相同。1。数据库服务器服务停止,
    2。与数据库服务器之间的网络发生中断以下异常发生在如上两种情况。首先会捕获到如下异常,此异常是在我周期性使用select查询时,发生了如上两种情况。
    此异常可判断为到数据库服务器的连接发生中断
    Error number: 80004005
    [DBNETLIB][ConnectionWrite (send()).]一般性网络错误。请检查网络文档。
    SQLState : 08S0 
    NativeError : b接下来,pConn->Close,并重新Open连接会发生如下异常,此异常是重新连接时抛出的。此时可判断为到远程服务器的连接完全中断Error number: 80004005
    [DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问。
    SQLState : 08001
    NativeError : 11处理这个问题,可以在捕获以上异常之后,不断地进行pConn->Open....,这里我纠正一下自己的一个错误,我曾经提到的要释放之前Connection实例,并重新CreateInstance,其实这种情况可以无需这样做,仅仅需要关闭发生异常的链接对象,然后重新Open捕获异常的代码如下,此代码的部分参考自ADO手册,并加以部分的修改
    for(;;)
    {
    try
    {
    if (isConnected)
    {
    pRs->Open(_bstr_t(sql),               
    _variant_t((IDispatch   *)pConn,true),
    adOpenStatic,
    adLockReadOnly,
    adCmdText);
    TRACE("Connection State = %d \n",pConn->State);
    if (pRs)
    if (pRs->State == adStateOpen)
    pRs->Close();
    }
    else
    {
    if (pConn)
    if (pConn->State == adStateOpen)
    pConn->Close();
    pConn->Open (_bstr_t(strCnn),_bstr_t(""),_bstr_t(""),adModeUnknown);
    isConnected=TRUE;
    }}
    catch (_com_error &pCome)
    {_variant_t vtConnect = (_variant_t)(pConn.GetInterfacePtr());//pRs->GetActiveConnection();// GetActiveConnection returns connect string if connection
    // is not open, else returns Connection object.
    switch(vtConnect.vt)
    {
    case VT_BSTR:
    PrintComError(pCome);
    break;
    case VT_DISPATCH:
    PrintProviderError(vtConnect);
    break;
    default:
    printf("Errors occured.");
    break;
    }isConnected= FALSE;
    }Sleep(1000);
    }///////////////////////////////////////////////////////////
    //                                                       //
    //      PrintProviderError Function                      //
    //                                                       //
    ///////////////////////////////////////////////////////////void PrintProviderError(_ConnectionPtr pConnection)
    {
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;if( (pConnection->Errors->Count) > 0)
    {
    long nCount = pConnection->Errors->Count;
    // Collection ranges from 0 to nCount -1.
    for(long i = 0; i < nCount; i++)
    {
    pErr = pConnection->Errors->GetItem(i);
    TRACE("Error number: %x\n%s\n", pErr->Number,
    (LPCSTR) pErr->Description);
    TRACE("SQLState : %s\n", (LPCTSTR)pErr->SQLState);
    TRACE("NativeError : %x\n", pErr->NativeError);
    }
    }
    }///////////////////////////////////////////////////////////
    //                                                       //
    //      PrintComError Function                           //
    //                                                       //
    ///////////////////////////////////////////////////////////void PrintComError(_com_error &e)
    {
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());// Print Com errors.  
    TRACE("Error\n");
    TRACE("\tCode = %08lx\n", e.Error());
    TRACE("\tCode meaning = %s\n", e.ErrorMessage());
    TRACE("\tSource = %s\n", (LPCSTR) bstrSource);
    TRACE("\tDescription = %s\n", (LPCSTR) bstrDescription);
    }
      

  7.   

    oracle的可能有所不同,如果实在不行,要connection->Close();connection.Release();connection=NULL;connection.CreateInstance(__uuidof(Connection));
    从新创建实例,并open链接
      

  8.   

    我也是用0x80004005来判断连接断开的。“connection->Close();connection.Release();connection=NULL;connection.CreateInstance(__uuidof(Connection));
    从新创建实例,并open链接”上面的做法,我试过很多次,效果一样。