kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

    一般来说,和数据库连接通常不容易断链,但是特别做些服务性质的,无人监守的程序时,则要考虑数据库连接的ado发生断链时的情况。在这种情况下,考虑建立数据库链路检测异常保护就是非常重要的。

通常,与数据库连接中断有以下2种情况:

1。数据库服务器服务停止,
2。与数据库服务器之间的网络发生中断


采用如下代码在使用做pRs做open查询操作时,抛出异常,此异常可判断为到数据库服务器的连接发生中断
Error   number:   80004005
[DBNETLIB][ConnectionWrite (WrapperWrite()).]一般性网络错误。请检查网络文档。
SQLState   :   08S0
NativeError   :   b

当pConn在Close,重新Open连接会发生异常,此异常是重新连接时抛出的。此时可判断为到远程服务器的连接完全中断
Error   number:   80004005
[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问。
SQLState   :   08001
NativeError   :   11

检测代码基本如下,此代码的部分参考自ADO手册,并加以部分的修改
for(;;)
{
    try {
        if   (g_isConnected) {
                pRs-> Open(_bstr_t(“select 1”),  _variant_t((IDispatch*)pConn,true), adOpenStatic,
                                   adLockReadOnly, adCmdText);
                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();
          switch(vtConnect.vt)
         {
                case   VT_BSTR:
                        PrintComError(pCome);
                        break;
                case   VT_DISPATCH:
                         PrintProviderError(vtConnect);
                         break;
               default:
                     printf( "Errors   occured. ");
                    break;
           }
           isConnected=   FALSE;
     }
     Sleep(1000);
}
void   PrintProviderError(_ConnectionPtr   pConnection)
{
             ErrorPtr     pErr     =   NULL;
             if(   (pConnection-> Errors-> Count)   >   0)
            {
                    long   nCount   =   pConnection-> Errors-> Count;
                   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);
                  }
            }
}

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);
}

 

把它整理成到一个线程中不断作为数据库链路检测,发现该连接断开则返回连接来处理。测试代码附文。我用的sql server数据库做测试过。源码下载位置:

http://www.pudn.com/downloads95/sourcecode/database/detail389188.html

posted on 2008-01-06 00:03 kenlistian 阅读(825) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理