多进程调用操作oracle数据库的DLL出错

versed8 2010-07-24 02:42:58
各位前辈:本人编写了一个操作oracle数据库的DLL程序,用ADO连接时,多个进程调用,出现错误,进程自己无法结束退出,代码如下:
CTime t=CTime::GetCurrentTime();
COleDateTime Time=(time_t)t.GetTime();
cardInitializationInf.InitializationLab="1";

TRY{
static CADODatabase *g_pDb;
CString strConnection="Provider=OraOLEDB.Oracle.1;Password=111;Persist Security Info=True;User ID=card;Data Source=xxzx";
g_pDb = new CADODatabase;
strtemp.Format("连接数据库 [%s]",strConnection);
WriteLog(strtemp);
if (!g_pDb->Open(strConnection)) {
WriteLog("连接数据库失败!");
return 800;
}
CADORecordset* pRs = new CADORecordset(g_pDb);
CString TempSql;
WriteLog("打开数据库表 [AZ03]");
if(!pRs->Open((LPCTSTR)"SELECT * FROM AZ03"))
{
WriteLog("打开数据库表 [AZ03] 失败!");
return 801;
}
dntm=CTime::GetCurrentTime();
str=dntm.Format(("%Y%m%d"));
pRs->AddNew();

//IP
AgenciesInfCard.IPstr="";
WSADATA wsadata;
WORD dwVersionRequested;
int err;
err=WSAStartup(dwVersionRequested,&wsadata);
char hostname[128];
if(gethostname(hostname,128)==0)
{

struct hostent *pHost = gethostbyname(hostname);
for (int i = 0; pHost != NULL && pHost->h_addr_list[i] != NULL; i++)
{
AgenciesInfCard.IPstr+=inet_ntoa(*(struct in_addr *)pHost->h_addr_list[i]);
}
WSACleanup();
}
str.Format("IP: %s",AgenciesInfCard.IPstr);
WriteLog(str);

strtemp=LW_number.Left(24);
pRs->SetFieldValue("AAZ001",strtemp);//唯一码
pRs->SetFieldValue("AAZ002",LW_ATR);//ATR
pRs->SetFieldValue("AAZ032",AgenciesInfCard.IPstr);//IP

pRs->SetFieldValue("AAZ004",AgenciesInfCard.Cardtime);//发卡时间
pRs->SetFieldValue("AAZ005",AgenciesInfCard.CardValid);//卡有效期
str="5";
pRs->SetFieldValue("AAZ006",str);//卡状态
pRs->Update();
pRs->Close();
WriteLog("写库成功!");
delete pRs;
delete g_pDb;
}CATCH(CDBException,E)
{
strtemp.Format("数据库查找出现系统级别冲突错误!2");
WriteLog(strtemp);
return -999;
}

END_CATCH
以上代码中的变量都已正常赋值

在用ODBC连接时,每次运行主程序时,累计到第四次调用出错,前三次正常。代码如下:
//回写数据库
CTime t=CTime::GetCurrentTime();
COleDateTime Time=(time_t)t.GetTime();
cardInitializationInf.InitializationLab="1";

TRY{

CDatabase p_db;

CString strConn,strLog;
int iRet;
strConn.Format("DSN=%s;UID=%s;PWD=%s",DSN_NAME,USERID,PASSWORD);
iRet=p_db.OpenEx(strConn);
//iRet=p_db.OpenEx("DSN=sxdbzzx");
if(iRet==0)
{
strLog.Format(" 打开数据库失败!! DSN=xxzx ");WriteLog(strLog);
return -2;
}

dntm=CTime::GetCurrentTime();
str=dntm.Format(("%Y%m%d"));
//IP
AgenciesInfCard.IPstr="";
WSADATA wsadata;
WORD dwVersionRequested;
int err;
err=WSAStartup(dwVersionRequested,&wsadata);
char hostname[128];
if(gethostname(hostname,128)==0)
{

struct hostent *pHost = gethostbyname(hostname);
for (int i = 0; pHost != NULL && pHost->h_addr_list[i] != NULL; i++)
{
AgenciesInfCard.IPstr+=inet_ntoa(*(struct in_addr *)pHost->h_addr_list[i]);
}
WSACleanup();
}
str.Format("IP: %s",AgenciesInfCard.IPstr);
WriteLog(str);
strtemp=LW_number.Left(24);
str="5";
//更新数据库
CString strSQL;
strSQL.Format("insert into AZ03(AAZ001,AAZ002,AAZ032,AAZ004,AAZ005,AAZ006) values('%s','%s','%s','%s','%s','%s')",strtemp,LW_ATR,AgenciesInfCard.IPstr,AgenciesInfCard.Cardtime,AgenciesInfCard.CardValid,str);
p_db.ExecuteSQL(strSQL); // 执行修改命令
p_db.Close();


}CATCH(CDBException,E)
{
strtemp.Format("数据库查找出现系统级别冲突错误!2");
WriteLog(strtemp);
return -999;
}

END_CATCH
错误提示如下:
1、Error opening TCP/IP Command Socket
2、Impossible to init multichip communication

请各位前辈指点错误原因或如何避免出错
...全文
114 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
versed8 2010-07-25
  • 打赏
  • 举报
回复
来人给提个解决办法啊!
versed8 2010-07-24
  • 打赏
  • 举报
回复
前辈们,快来帮个忙啊!我的饭碗帮您们的了
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

15,446

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧