用vc写了个网络服务程序,启动类型为自动,该服务程序调用了个dll,用ado,负责将接收的数据写入数据库.
现出现个奇怪现象:
在dll里,数据处理线程调用了如下函数:
int CDbhApp::SaveRtToDb(_ConnectionPtr &conn,_CommandPtr &cmd,int len, char *buf)
{
CString sql="insert into k_realdata(mineid,nodeid,sensortypeid,nodeplace,sensorname,sensorunit,realdata,stateid,datatime)values(";
sql+=CString(buf+3)+")"; int ret=0;
try
{
cmd->ActiveConnection=conn;
cmd->CommandText=_bstr_t(_variant_t(sql));
cmd->CommandType=adCmdText;
cmd->Execute(NULL,NULL,adCmdText);
ret=1;
}
catch(CSeException *ex)//处理结构化异常
{
char err[256]={0};
ex->GetErrorMessage(err,256);
CString strErr;
strErr.Format("SaveRtToDb()-%s",err);
theApp.WriteLog(strErr,0);
ex->Delete();
return 0;
}
catch(_com_error &e)//处理ado异常
{
char lpBuff[100];
memset(lpBuff,0x00,100);
char *p=_com_util::ConvertBSTRToString(e.Description());
sprintf(lpBuff,"保存实时数据时发生异常:%s-%s",p,sql);
TRACE("%s\n",lpBuff);
WriteLog(lpBuff,0);
if(p!=NULL)
{
delete p;
p=NULL;
}
return 0;
}
catch(...)//处理其他异常
{
WriteLog("保存数据时发生错误",0);
return 0;
}
return ret;
}
现象是当该函数出现异常时,会导致服务程序重新启动.
将该函数由另一个界面程序执行时,认为制造异常后,程序也不会退出的.
疑问:
1.难到服务管理器会检测异常,并将相应的自动启动类型的服务程序重新启动?
2.以前该函数调用存储过程,发生异常后服务并不重新启动,两种处理方式在服务程序看来有什么不一样?