⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wzbase.cpp

📁 这是一个可供他人调用的动态连接库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			iotype = SQL_PARAM_INPUT;
		else{
			iotype = SQL_PARAM_OUTPUT;
			m_para->pVarArr[i].pcVal[0]='\0';
		}

		switch(m_para->pVarArr[i].vt)
		{
			case VT_PS:
				sho = (short)atoi(m_para->pVarArr[i].pcVal);
				*m_para->pVarArr[i].psVal = sho;
				m_rc=SQLBindParameter(m_hstmt,i+2,iotype,SQL_C_SHORT,SQL_SMALLINT,0,0,m_para->pVarArr[i].psVal,0,&cb0);
				break;
			case VT_PI:
				lon = atol(m_para->pVarArr[i].pcVal);
				*m_para->pVarArr[i].piVal = lon;
				m_rc=SQLBindParameter(m_hstmt,i+2,iotype,SQL_C_LONG,SQL_INTEGER,0,0,m_para->pVarArr[i].piVal,0,&cb0);
				break;
			case VT_PD:
				dou = atof(m_para->pVarArr[i].pcVal);
				*m_para->pVarArr[i].pdVal = dou;
				m_rc=SQLBindParameter(m_hstmt,i+2,iotype,SQL_C_DOUBLE,SQL_FLOAT,0,0,m_para->pVarArr[i].pdVal,0,&cb0);
				break;
			case VT_PC:
				m_rc=SQLBindParameter(m_hstmt,i+2,iotype,SQL_C_CHAR,SQL_VARCHAR,0,0,m_para->pVarArr[i].pcVal,m_para->pVarArr[i].len+1,&cbNTS);
				break;
			case VT_PB:
				m_rc=SQLBindParameter(m_hstmt,i+2,iotype,SQL_C_BINARY,SQL_BINARY,0,0,m_para->pVarArr[i].pbVal,m_para->pVarArr[i].len+1,(SDWORD *)&(m_para->pVarArr[i].len));
				break;
			default:
				m_rc=SQLBindParameter(m_hstmt,i+2,iotype,SQL_C_CHAR,SQL_VARCHAR,0,0,m_para->pVarArr[i].pcVal,m_para->pVarArr[i].len+1,&cbNTS);
				break;
		}
	}

	strcat(m_sqlstmt,"} ");

	m_rc = SQLExecDirect(m_hstmt,(unsigned char *)m_sqlstmt,SQL_NTS);
	if(m_rc == SQL_SUCCESS || m_rc == SQL_SUCCESS_WITH_INFO)
	{
/****************************** add later ********************/
		for(i=0;i<m_varnum;i++)
		{
			//if(m_para->pVarArr[i].io == IO_OUT)
			{
				switch(m_para->pVarArr[i].vt)
				{
					case VT_PS:
						sho = *(m_para->pVarArr[i].psVal);
						sprintf(m_para->pVarArr[i].pcVal,"%ld",sho);
						break;
					case VT_PI:
						lon = *(m_para->pVarArr[i].piVal);
						sprintf(m_para->pVarArr[i].pcVal,"%ld",lon);
						break;
					case VT_PD:
						dou = *(m_para->pVarArr[i].pdVal);
						sprintf(m_para->pVarArr[i].pcVal,"%.2lf",dou);
						break;
					default:
						break;
				}
			}
		}
/***************************************************/

		if(!GetFet(id,m_hstmt,m_para,pres))
		{
			SQLFreeStmt(m_hstmt,SQL_DROP);
			strcpy(pres->szErrMsg,"取结果集失败");
			return FALSE;
		}
		SQLFreeStmt(m_hstmt,SQL_DROP);
		DelPtr(id);
#ifdef LOGON
		BaseLog(id,msg,2);
		msg[0]=0;
		sprintf(msg,"retcode = %d",m_ret);
		if(strlen(szNotLogFun)>0)
		{
			if(strstr(msg,szNotLogFun))
				BaseLog(id,msg,5);
			else
				BaseLog(id,msg,2);
		}
		else
			BaseLog(id,msg,2);
#endif
		strcpy(pres->szErrMsg,"执行成功");
		pres->iRet = m_ret;
		return TRUE;
	}
	else
	{
		DetErr(id,m_hstmt,m_rc);
		SQLFreeStmt(m_hstmt,SQL_DROP);
		strcpy(pres->szErrMsg,"执行存储过程失败");
		return FALSE;
	}
}

BOOL GetFet(int id,HSTMT m_hstmt,MyParams * m_para,pResult m_pres)
{
	int i;

	PTR			rgbDesc = NULL;			// pointer to storage for descriptor info
	SWORD		cbDescMax = 0;	        // max length of rgbDesc buffer
	SWORD   FAR	pcbDesc = 0;			// number of bytes returned in rgbDesc
	SWORD	    nresultcols = 0;		// number of result columns
	RETCODE m_rc;
	
	SQLNumResultCols(m_hstmt,&nresultcols);
	if(nresultcols<=0)
	{
		while(SQLMoreResults(m_hstmt)!=SQL_NO_DATA_FOUND)
		{
			SQLNumResultCols(m_hstmt,&nresultcols);
			if(nresultcols>0)
				break;
		}
	}

	if(nresultcols<=0)
	{
		m_para->bHasFet=FALSE;
		m_para->RowNum=0;
		m_para->FetNum=0;
		m_pres->bHasRet=FALSE;
		return TRUE;
	}
	else 
		m_para->bHasFet=TRUE;
	m_para->FetNum = nresultcols;

	if(nresultcols>MAXCOLS){
		m_pres->retData.rtArray.iCol =MAXCOLS;
	}
	else 
		m_pres->retData.rtArray.iCol =nresultcols;

	m_para->RowNum=0;
	// Build the column description for this results set.
	for (i = 0; i < nresultcols; i++) 
	{
		if(i>=MAXCOLS){
			SQLBindCol(m_hstmt, 
					i+1, 
					SQL_C_CHAR,
					&m_para->pFetArr[MAXCOLS].pbVal,
					MAXLEN,
					&m_para->pFetArr[MAXCOLS].len);
		}
		else {
			SQLBindCol(m_hstmt, 
					i+1, 
					SQL_C_CHAR,
					&m_para->pFetArr[i].pbVal,
					MAXLEN,
					&m_para->pFetArr[i].len);
		}
	}
	m_pres->retData.rtArray.iRow=0;
	
	int rowcount=0;
	while((m_rc=SQLFetch(m_hstmt)) != SQL_NO_DATA_FOUND)
	{
		if (!((SQL_SUCCESS == m_rc) ||(SQL_SUCCESS_WITH_INFO == m_rc)))
		{
			DetErr(id,m_hstmt,m_rc);
			return FALSE;
		}
		if(rowcount > MAXROWS){
			m_pres->iRetHandle=0;
			m_pres->bHasNext=FALSE;
//			m_pres->bHasNext=TRUE;
//			m_pres->iRetHandle=id+1;//id+1,then always id!=0 
			//? pagedown
			break;
		}
		for(i=0;i<m_pres->retData.rtArray.iCol;i++){
			if(m_para->pFetArr[i].len>0){	
				memcpy(m_pres->retData.rtArray.Array[rowcount][i],
					&m_para->pFetArr[i].pbVal,MAXLEN);
				if(m_para->pFetArr[i].len<MAXLEN)
					m_pres->retData.rtArray.Array[rowcount][i][m_para->pFetArr[i].len]=0;
			}
			else		//by lsm 2000.01.05
				m_pres->retData.rtArray.Array[rowcount][i][0]=0;
		}
		m_pres->retData.rtArray.iRow++;
		rowcount ++;
	}
	m_para->RowNum = rowcount;
	if(m_pres->retData.rtArray.iRow>0)
		m_pres->bHasRet=FALSE;
	
	return TRUE;
}

UWORD DetErr(int id,HSTMT m_hstmt,RETCODE retcode)
{
	UCHAR szSqlState[30];
	SDWORD pfNative[10];
	SWORD  cbMsgMax = 300;
	SWORD  cbMsgOut;
	UCHAR  szErrorMsg[301]="连接数据库失败,请重试!";
	UWORD  rc;

	if(retcode ==0)
		return 0;

	switch(retcode)
	{
		case SQL_SUCCESS_WITH_INFO:
		case SQL_ERROR:
		case SQL_NEED_DATA:
		case SQL_STILL_EXECUTING:
		case SQL_INVALID_HANDLE:
			SQLError(NULL, NULL, m_hstmt, szSqlState, pfNative, szErrorMsg, cbMsgMax, &cbMsgOut);
#ifdef LOGON
			char msg[200];
			sprintf(msg,"Error state:%s,error msg:%s",szSqlState,szErrorMsg);
			BaseLog(id,msg,1);
#endif
			rc = 4;
			break;
		case SQL_NO_DATA_FOUND:
			rc = 5;
			break;
		default:
			rc = 10;
			break;
		}
	return rc;
}

BOOL Conn(int id)
{
	if(id < 0 || id >= max)
		return FALSE;

	if(ConnArr[id].conned)
		return TRUE;

	RETCODE ret=SQLConnect(ConnArr[id].hdbc,(unsigned char *)base,SQL_NTS,(unsigned char *)user,SQL_NTS,(unsigned char *)pass,SQL_NTS);
	if(ret != SQL_SUCCESS && ret !=SQL_SUCCESS_WITH_INFO)
	{
#ifdef LOGON
		BaseLog(id,"Cannot connect to odbc",1); 
#endif
		return FALSE;
	}

	ConnArr[id].conned = TRUE;
	return TRUE;
}

BOOL ConnInit()
{
	for(int i=0;i<max;i++)
	{
		if(Conn(i))
			ConnArr[i].conned = TRUE;
		else
			ConnArr[i].conned = FALSE;
	}
	return TRUE;
}

int GetId()
{
	if(WaitForSingleObject(hmutex,500) != WAIT_OBJECT_0)
		return -1;

	for(int i=0;i<50;i++)
	{
		for(int id=0;id<max;id++)
		{
			if(!ConnArr[id].usedf)
			{
				if(!ConnArr[id].conned && !Conn(id))
				{
					ReleaseMutex(hmutex);
					return -1;
				}
				ConnArr[id].usedf = TRUE;
				ReleaseMutex(hmutex);
				return id;
			}
		}
		_sleep(10);
	}

	ReleaseMutex(hmutex);
	return -1;
}

BOOL ReleaseId(int id)
{
	ConnArr[id].usedf = FALSE;
	return TRUE;
}

BOOL BaseLog(int id,LPCTSTR msg,int lType)
{
	FILE * hlog = NULL;
	BOOL bDeleted = FALSE;

	if(!strcmp(levl,"0"))
		return TRUE;
	if( (!strcmp(levl,"1")) && (lType >= 2))
		return TRUE;
	time_t mytime;
	struct tm * nowtime;
	time(&mytime );                
	nowtime = localtime(&mytime);
	char szTime[50];
	sprintf(szTime,"%02d%02d%02d %02d:%02d:%02d",nowtime->tm_year+1900,
			nowtime->tm_mon+1,nowtime->tm_mday,
			nowtime->tm_hour,nowtime->tm_min,nowtime->tm_sec);

	if(WaitForSingleObject(fmutex,300) != WAIT_OBJECT_0)
		return FALSE;
	//删除前一日文件
	if ((dele[0]=='Y')||(dele[0]=='y'))
		if ((giLastLog != nowtime->tm_mday) && (giLastLog!=0))
		{
			DeleteFile(BASE_LOG);
			bDeleted=TRUE;
		}
	
	giLastLog = nowtime->tm_mday;
	
	
	if((hlog = fopen(BASE_LOG,"a+"))==NULL)
	{
		ReleaseMutex(fmutex);
    	return FALSE;
	}
	if (bDeleted)
		fprintf(hlog,"Just deleted yesterday log file!\n");
	if (id == COMM)
	{
		fprintf(hlog,"%s %s",szTime,msg);
		fprintf(hlog,"\n");
	}
	else
	{
		fprintf(hlog,"%s ConnId%d:%s",szTime,id,msg);
		fprintf(hlog,"\n");
	}
	fclose(hlog);
	ReleaseMutex(fmutex);

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -