多进程调用操作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

请各位前辈指点错误原因或如何避免出错
...全文
69 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
versed8 2010-07-25
  • 打赏
  • 举报
回复
来人给提个解决办法啊!
versed8 2010-07-24
  • 打赏
  • 举报
回复
前辈们,快来帮个忙啊!我的饭碗帮您们的了

15,440

社区成员

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

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