ado连接oracle的语句是
CString csConnectionString="Provider=MSDAORA.1;Password="+password+";User ID="+user+";Data Source="+instance+";Persist Security Info=True";

hr = g_Connection->Open((_bstr_t)csConnectionString,(_bstr_t)"",(_bstr_t)"",-1);使用这样的方式,是可以正常连接数据库并对数据库进行操作的
但是当网线拔掉之后,重新插入网线,程序中所有使用ado进行数据操作的操作全部失败,请问这时为什么
谢谢

解决方案 »

  1.   

    物理链路中断再恢复之后,原来ADODB.connection对象实例,重新close再open数据库连接是无效的。
    应当释放该实例,并重新createinstance一个实例,并open指定连接
      

  2.   

    这里的物理链路中断是说以下两种情况,和通常所说的网络的物理连接中断不完全相同。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);
    }