使用ADO连接oracle 10g,当将网线拔掉之后在重新插入网线的时候,ADO所有的操作数据库操作都会出错,为什么解决思路

使用ADO连接oracle 10g,当将网线拔掉之后在重新插入网线的时候,ADO所有的操作数据库操作都会出错,为什么
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进行数据操作的操作全部失败,请问这时为什么
谢谢


------解决方案--------------------
连接断开了,要重新连接。
------解决方案--------------------
你都断开了,当然出错,这不是显然的吗?本来已建立的连接中断了,失去了联系,程序无法取得数据了.重新接上网线又无法接上 "程序内在的连接 ".当然无效.

程序里可以这样处理:检查到错误后,尝试重新联接数据库,如果不成功则等待5秒,然后再次尝试,如果又不成功,再等待10秒,再试,再不成功,就要提示出错了.不能一直试下去会死循环的.
------解决方案--------------------
物理链路中断再恢复之后,原来ADODB.connection对象实例,重新close再open数据库连接是无效的。
应当释放该实例,并重新createinstance一个实例,并open指定连接
------解决方案--------------------
这里的物理链路中断是说以下两种情况,和通常所说的网络的物理连接中断不完全相同。

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;