📄 hopekingdatabase.cpp
字号:
// HopeKingDatabase.cpp: implementation of the CHopeKingDatabase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HopeKingDatabase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHopeKingDatabase::CHopeKingDatabase(CDataBus * pBus):CAsynWorker(pBus)
{
m_defaultSql.m_pDatabase=this;
m_ParamSql.m_pDatabase=this;
}
CHopeKingDatabase::~CHopeKingDatabase()
{
CloseData();
}
int CHopeKingDatabase::ExcuteOdbc(LPCTSTR szExcuteSql,int iflag,UniVar & uvSpyy,int iParNum,UniVar * pParam)
{
int pnum=iParNum;
int excuteflag=0;
*m_defaultSql.m_Ret.m_Data.m_pInt=0;
switch(iflag&0xf000){
case nProcedureName:
if((iflag&nNoReturn)==nNoReturn){
excuteflag=1;
}
else{
excuteflag=0;
}
if((iflag&nPamTypePointed)==nPamTypePointed){
if((iflag&nPmPointedSet)==nPmPointedSet){
pnum=iParNum/2;
m_defaultSql.SetParaNum(pnum);
for(int i=0;i<pnum;i++){
m_defaultSql.SetParamValue(i,pParam[i],(int)pParam[i+pnum]);
}
}
else {
m_defaultSql.SetParaNum(pnum);
for(int i=0;i<pnum;i++){
m_defaultSql.SetParamValue(i,pParam[i]);
}
}
}
else{
CString csCmd=m_csProcInfo,cst="\'";
cst+=szExcuteSql;
cst+="\'";
csCmd.Replace("?",cst);
m_ParamSql.SetParaNum(0);
if(!m_ParamSql.ExcuteSql(csCmd,3)){
uvSpyy="信息查询语句有误";
return -25001;
}
if(!m_ParamSql.IsOpen()){
uvSpyy="信息查询语句有误";
return -25001;
}
m_defaultSql.SetParaNum(pnum);
int ii=0;
while(!m_ParamSql.IsEOF()){
if(ii>=pnum){
uvSpyy="参数错误";
return -25002;
}
int isoutp=m_ParamSql.GetResultValueI(0);
int istype=m_ParamSql.GetResultValueI(1);
int ilen=m_ParamSql.GetResultValueI(2);
int itype=nSqlParam;
if(isoutp)
itype=nSqlOutputParam;
switch(istype){
case SQLTEXT :
case SQLVARCHAR :
case SQLCHARACTER :
case SQLMONEY :
case SQLMONEYN :
case SQLMONEY4 :
case SQLDECIMAL :
case SQLDECIMALN :
case SQLNUMERIC :
case SQLNUMERICN :
break;
case SQLINT1 :
itype+=1;
break;
case SQLINT2 :
itype+=2;
break;
case SQLFLT4 :
itype+=3;
break;
case SQLFLT8 :
case SQLFLTN :
itype+=4;
break;
case SQLDATETIME :
case SQLDATETIMN :
case SQLDATETIM4 :
itype+=5;
break;
case SQLBINARY :
case SQLVARBINARY :
itype+=6;
break;
case SQLIMAGE :
itype+=7;
break;
case SQLBIT :
itype+=8;
break;
case SQLINTN :
case SQLINT4 :
itype+=9;
break;
}
m_defaultSql.SetParamValue(ii,pParam[ii],itype);
ii++;
m_ParamSql.MoveNext();
}
if(ii!=pnum){
uvSpyy="参数错误";
return -25002;
}
}
break;
case nTableName:
{
excuteflag=5;
m_defaultSql.SetParaNum(pnum);
for(int i=0;i<pnum;i++){
pParam[i].ToA();
m_defaultSql.SetParamValue(i,pParam[i],0);
}
}
break;
case nSqlClause:
{
excuteflag=3;
if((iflag&nPmPointedSet)==nPmPointedSet){
pnum=iParNum/2;
m_defaultSql.SetParaNum(pnum);
for(int i=0;i<pnum;i++){
m_defaultSql.SetParamValue(i,pParam[i],(int)pParam[i+pnum]);
}
}
else {
m_defaultSql.SetParaNum(pnum);
for(int i=0;i<pnum;i++){
m_defaultSql.SetParamValue(i,pParam[i]);
}
}
}
break;
default:
uvSpyy="执行标志错误";
return -25003;
}
if(!m_defaultSql.ExcuteSql(szExcuteSql,excuteflag)){
uvSpyy="执行失败";
return -25004;
}
else{
return *m_defaultSql.m_Ret.m_Data.m_pInt;
}
}
void CHopeKingDatabase::OnMsgReceive(CUniMsg * pMsg)
{
switch(pMsg->m_dwCommand){
case CMD_TASK_RUNTASK:
{
CUniMsg um;
um.m_dwCommand=CMD_TASK_RUNTASK;
um.m_btMsgType=MSG_RESPONSE;
um.m_dwSendMode=pMsg->m_dwReceiveMode;
um.m_dwReceiveMode=pMsg->m_dwSendMode;
um.m_pReceivor=pMsg->m_pSender;
um.m_pSender=pMsg->m_pReceivor;
um.m_dwIdent=pMsg->m_dwIdent;
um.m_ierror=0;
if(pMsg->GetSize()<3){
um.m_ierror=-25000;
um.Add(-25000);
um.Add("参数不够");
m_pBus->SendMessage(&um,m_btCurRoad);
return;
}
else{
LPCTSTR lpsql=(LPCTSTR)(pMsg->m_pTV[1].ToA());
if(!lpsql||!lpsql[0]){
um.m_ierror=-25005;
um.Add(-25005);
um.Add("执行体不存在");
m_pBus->SendMessage(&um,m_btCurRoad);
return;
}
try{
int iflag=(int)pMsg->m_pTV[2];
UniVar uvSpyy;
int irunst=ExcuteOdbc(lpsql,iflag,uvSpyy,pMsg->GetSize()-3,pMsg->m_pTV+3);
um.Add(irunst);
um.Add(uvSpyy);
if(irunst<=-25000){
um.m_ierror=irunst;
m_pBus->SendMessage(&um,m_btCurRoad);
return;
}
int irow=0;
int icol=m_defaultSql.m_iPreDefColNum;
um.Add(m_defaultSql.m_iParamNum);
um.Add(icol);
um.Add(irow);
for(int i=0;i<m_defaultSql.m_iParamNum;i++){
m_defaultSql.GetParamValue(i,uvSpyy);
um.Add(uvSpyy);
}
if((nWantResult&iflag)==nWantResult){
if(m_defaultSql.IsOpen()){
irow=0;
while(!m_defaultSql.IsEOF()){
for(i=0;i<icol;i++){
m_defaultSql.GetResultValue(i,uvSpyy);
um.Add(uvSpyy);
}
irow++;
m_defaultSql.MoveNext();
}
um.m_pTV[4]=irow;
}
}
m_defaultSql.Close();
m_pBus->SendMessage(&um,m_btCurRoad);
return;
}
catch(...){
um.m_ierror=-25010;
um.RemoveAll();
um.Add(-25010);
um.Add("发生异常");
m_pBus->SendMessage(&um,m_btCurRoad);
return;
}
}
}
break;
default:
CAsynWorker::OnMsgReceive(pMsg);
}
}
void CHopeKingDatabase::QueueMenuberTimeOut(CUniMsg *pMsg)
{
CUniMsg um;
um.m_dwCommand=CMD_TASK_RUNTASK;
um.m_btMsgType=MSG_RESPONSE;
um.m_dwSendMode=pMsg->m_dwReceiveMode;
um.m_dwReceiveMode=pMsg->m_dwSendMode;
um.m_pReceivor=pMsg->m_pSender;
um.m_pSender=pMsg->m_pReceivor;
um.m_dwIdent=pMsg->m_dwIdent;
um.m_ierror=-25008;
um.Add(-25008);
um.Add("超时");
m_pBus->SendMessage(&um,m_btCurRoad);
}
void CHopeKingDatabase::OnSynMsg(CUniMsg * pMsg,CUniMsg * pCmdReceive)
{
switch(pMsg->m_dwCommand){
case CMD_TASK_RUNTASK:
{
if(pMsg->GetSize()<3){
pCmdReceive->Add(-25000);
pCmdReceive->Add("参数不够");
return;
}
else{
LPCTSTR lpsql=(LPCTSTR)(pMsg->m_pTV[1].ToA());
if(!lpsql||!lpsql[0]){
pCmdReceive->Add(-25005);
pCmdReceive->Add("执行体不存在");
return;
}
try{
int iflag=(int)pMsg->m_pTV[2];
UniVar uvSpyy;
int irunst=ExcuteOdbc(lpsql,iflag,uvSpyy,pMsg->GetSize()-3,pMsg->m_pTV+3);
pCmdReceive->Add(irunst);
pCmdReceive->Add(uvSpyy);
if(irunst<=-25000){
return;
}
int irow=0;
int icol=m_defaultSql.m_iPreDefColNum;
pCmdReceive->Add(m_defaultSql.m_iParamNum);
pCmdReceive->Add(icol);
pCmdReceive->Add(irow);
for(int i=0;i<m_defaultSql.m_iParamNum;i++){
m_defaultSql.GetParamValue(i,uvSpyy);
pCmdReceive->Add(uvSpyy);
}
if((nWantResult&iflag)==nWantResult){
if(m_defaultSql.IsOpen()){
irow=0;
while(!m_defaultSql.IsEOF()){
for(i=0;i<icol;i++){
m_defaultSql.GetResultValue(i,uvSpyy);
pCmdReceive->Add(uvSpyy);
}
irow++;
m_defaultSql.MoveNext();
}
pCmdReceive->m_pTV[4]=irow;
}
}
m_defaultSql.Close();
return;
}
catch(...){
pCmdReceive->RemoveAll();
pCmdReceive->Add(-25010);
pCmdReceive->Add("发生异常");
SendMsg(pCmdReceive,m_btCurRoad);
return;
}
}
}
break;
default:
CAsynWorker::OnSynMsg(pMsg,pCmdReceive);
}
}
void CHopeKingDatabase::CloseData()
{
m_ParamSql.RealCloseSql();
m_defaultSql.RealCloseSql();
for(int i=0;i<m_ListSql.GetSize();i++){
m_ListSql[i]->RealCloseSql();
delete m_ListSql[i];
};
}
COdbcMg::COdbcMg(CDataBus * pBus):CAsynWorker(pBus)
{
InitializeCriticalSection(&statArea);
m_pDefaultOdbc=NULL;
};
COdbcMg::~COdbcMg()
{
if(m_pDefaultOdbc){
m_pDefaultOdbc->CloseData();
delete m_pDefaultOdbc;
m_pDefaultOdbc=NULL;
}
for(int i=0;i<m_ListOdbcData.GetSize();i++){
if(m_ListOdbcData[i]->IsValid()){
m_ListOdbcData[i]->CloseData();
delete m_ListOdbcData[i];
}
}
m_ListOdbcData.RemoveAll();
DeleteCriticalSection(&statArea);
}
void COdbcMg::OpenDefaultOdbc(LPCTSTR procinfo,LPCTSTR tableinfo)
{
if(!procinfo||!tableinfo)return;
if(!procinfo[0]||!tableinfo[0])return;
if(!m_pDefaultOdbc){
m_pDefaultOdbc=new CHopeKingDatabase(m_pBus);
m_pDefaultOdbc->PointeRoad(1);
}
if(!m_pDefaultOdbc->IsOpen()){
if(m_csDefaultAlis.IsEmpty()||m_csDefaultDsn.IsEmpty())
return;
m_OdbcDataMap.SetAt(m_csDefaultAlis,(void *)m_pDefaultOdbc);
m_pDefaultOdbc->m_csDsn=m_csDefaultDsn;
m_pDefaultOdbc->m_csAlis=m_csDefaultAlis;
m_pDefaultOdbc->m_csProcInfo=procinfo;
m_pDefaultOdbc->m_csTableInfo=tableinfo;
TRY{
m_pDefaultOdbc->OpenEx(m_csDefaultDsn,CDatabase::noOdbcDialog);
}
CATCH(CDBException, e)
{
m_pDefaultOdbc->Close();
}
END_CATCH
}
}
CHopeKingDatabase * COdbcMg::OpenOdbc(LPCTSTR szAlis,LPCTSTR lpszConnect,LPCTSTR procinfo,LPCTSTR tableinfo)
{
if(!szAlis||!lpszConnect)return NULL;
if(!szAlis[0]||!lpszConnect[0])return NULL;
if(!procinfo||!tableinfo)return NULL;
if(!procinfo[0]||!tableinfo[0])return NULL;
EnterCriticalSection(&statArea);
CHopeKingDatabase * pDbs=GetOdbc(szAlis);
if(pDbs){
LeaveCriticalSection(&statArea);
return pDbs;
}
pDbs=new CHopeKingDatabase(m_pBus);
m_ListOdbcData.Add(pDbs);
pDbs->PointeRoad(1);
try{
m_OdbcDataMap.SetAt(szAlis,(void *)pDbs);
pDbs->m_csDsn=lpszConnect;
pDbs->m_csAlis=szAlis;
pDbs->m_csProcInfo=procinfo;
pDbs->m_csTableInfo=tableinfo;
TRY{
pDbs->OpenEx(lpszConnect,CDatabase::noOdbcDialog);
}
CATCH(CDBException, e)
{
pDbs->Close();
}
END_CATCH
}
catch(...){
}
LeaveCriticalSection(&statArea);
return pDbs;
}
void COdbcMg::CloseOdbc(CHopeKingDatabase * pDbs)
{
if(!pDbs->IsValid())
return;
EnterCriticalSection(&statArea);
try{
CString csa=pDbs->m_csAlis;
if(pDbs!=GetOdbc(csa)){
LeaveCriticalSection(&statArea);
return;
}
}
catch(...){
LeaveCriticalSection(&statArea);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -