2012-10-25 87 views
-2

我是新来的套接字编程,我们有一个正在运行的MFC客户端应用程序通过网络,由于某种原因,套接字每天至少断开一次。这不是网络问题,因为其他网络应用运行良好。但是我注意到了日志中的某些内容,即在套接字断开连接之前,数据库错误或多或少出现10分钟。就像:C++ Socket间歇性断开连接

DB ERROR: ADO Error 1 (s) 
select l.LABOID, l.LABOCODE, l.LABOCREDATE, l.LABOTEXT, l.SHORTTEXT,  l.LISACCOUNTINGMODE, l.ADDRESS1, l.ADDRESS2, l.POSTALCODE, l.CITY, l.STATE, l.COUNTRY, the . TELEPHON, l.FAX, l.EMAIL, l.TELEPHON2, l.NATIONALCODE, l.FIRSTITEMID, l.ALTERNATECODE, l.LABOSERVICEID, l.STARTVALIDDATE, l.ENDVALIDDATE, l.LOGUSERID, l.LOGDATE, b.DICBINARYID , b.OBJECTLINK, b.OBJECTTYPE, b.DICBINARYTYPE, b.BINARYDATE, b.BINARYMIMETYPE, b.BINARYSIZE, b.LOGUSERID, b.LOGDATE, b.BINARYOBJECT, (select count (*) from d DICT_LABO_TO_DEVICE Where l.LABOID = d.LABOID) as NB_DEVICES from DICT_LABORATORIES l, b DICT_BINARY_DATA Where l.ENDVALIDDATE is null and l.LABOCODE like '%%' and l.LABOID b.OBJECTLINK = (+) and b.DICBINARYTYPE (+) = 1 and b . OBJECTTYPE (+) = 7 AND LABOID IN (1) order by l.LABOCODE 

ORA-00936: missing expression of 
Error: 0x80040e14 

在调试模式,我发现线程仍在运行,但套接字未连接。我无法确定是什么导致它断开连接。 建议发起重新连接吗? 下面的代码块:

if (m_pClientSocket->IsThreadStillRunning()) 
    { 
    if(m_pClientSocket->m_boSocketConnected) 
    { 
     dwNbSent_L = *pdwBufferSize_P;   
     m_pClientSocket->Write(pbyBuffer_P, *pdwBufferSize_P); 
     iotResult_L = IOTRANS_RESULT_SUCCESS; 
    } 
    else 
    { 
     m_pobjSession->Write(MSG_ERROR,TRACE_LOW 
          ,_T("%s Client socket is not connected") 
          ,(LPCTSTR)m_strLastErrFunc); 
     iotResult_L = IOTRANS_RESULT_FAILED; 
     SetError(ERROR_SOCKET_NOT_CONNECTED, _T("Client socket is not connected"), m_strLastErrFunc); 
    } 
    } 

谁能给我一个JumpStart目或项目清单来检查,以防止这种情况的发生?

+3

你连接了什么?网络连接是否下降?客户端是否断开连接?我们无法提供所需的信息来帮助解决这个问题。 –

+2

网络连接没有问题,但客户端在获取此错误后断开连接。 – Owen

+1

我想冒险猜测,并说错误处理代码,看到数据库错误,然后决定关闭连接。 –

回答

1

这是最可能的不是发生网络错误。

Oracle DB无法解析SQL语句(导致错误ORA-00938),顶层的ADO层将Oracle错误转换为ADO错误0x80040e14,这意味着'该命令包含一个或多个错误。'。

这可能会导致您的应用程序出现bug。

你可以做的是:

  • 检查(调试)您的应用程序,它如何创造它的SQL statments。
  • 检查您的数据库是否应用了应用程序不知道的某些更改(删除表/视图或重命名/删除的列)。