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

📄 wzbase.cpp

📁 这是一个可供他人调用的动态连接库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
	wzBase.dll修改记录

	修改日期:2000.03.12
	修改要点:支持SQLServer7.0
  
	修改日期:2000.04.06
	修改要点:1.加重连接功能
			  2.增强日志文件功能
			  3.配置文件新增:(可不加,取缺省值)
				[LOG]
				PATH=			;日志文件路径(缺省:.\)
				LEVEL=			;记录级别(缺省:0)
				DELEVERYDAY=	;Y自动删除前一天日志 N不删除前一天日志(缺省:Y)

*/


#include "wzbase.h"
#include "time.h"
#define LOGON
CONN ConnArr[BASE_MAXCONN];
HENV	 henv;
HANDLE   hmutex = NULL;
HANDLE   fmutex = NULL;
char	 base[21];
char	 user[21];
char	 pass[21];
char	 levl[21];
char	 path[81];
int		 max;
int		 giLastLog = 0;	//上次LOG日期
char	 BASE_LOG[100];
char	 dele[2];
char	szNotLogFun[100]; 
BYTE szGet65p[]="select b.status,b.type,b.length from sysobjects a,syscolumns b where a.id=b.id and a.type='P' and a.name=? order by colid";
BYTE szGet70p[]="select b.isoutparam,b.type,b.length from sysobjects a,syscolumns b where a.id=b.id and a.type='P' and a.name=? order by colid";
BOOL b70sql=FALSE;

BOOL WINAPI DllMain(HINSTANCE hinstDLL,
					DWORD dwReason,
					LPVOID lpReserved)
{
	BOOL OK = TRUE;
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		OK = InitDll();
		break;
	case DLL_PROCESS_DETACH:
		ExitDll();
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
		break;
	}
	return OK;
}

BOOL InitDll()
{
	char maxc[21];

	if((hmutex = CreateMutex(NULL,FALSE,NULL))==NULL)
		return FALSE;
	if((fmutex = CreateMutex(NULL,FALSE,NULL))==NULL)
		return FALSE;
	
	if(GetPrivateProfileString("ODBC","BASE",BASE_BASE,base,20,BASE_CONFIG) < 0)
		strcpy(base,BASE_BASE);
	
	if(GetPrivateProfileString("ODBC","USER",BASE_USER,user,20,BASE_CONFIG) < 0)
		strcpy(user,BASE_USER);

	if(GetPrivateProfileString("ODBC","PASS",BASE_PASS,pass,20,BASE_CONFIG) < 0)
		strcpy(pass,BASE_PASS);
	
	if(GetPrivateProfileString("ODBC","MAXC",BASE_MAXC,maxc,20,BASE_CONFIG) < 0)
		strcpy(maxc,BASE_MAXC);

	if(GetPrivateProfileString("LOG","LEVEL",LOG_LEVEL,levl,20,BASE_CONFIG) < 0)
		strcpy(levl,LOG_LEVEL);

	if(GetPrivateProfileString("LOG","DELEVERYDAY",DELEVERYDAY,dele,2,BASE_CONFIG) < 0)
		strcpy(dele,DELEVERYDAY);

	if(GetPrivateProfileString("LOG","PATH", ".\\",path,80,BASE_CONFIG) < 0)
		strcpy(path,".\\");

	GetPrivateProfileString("LOG","NOTLOGFUN","",szNotLogFun,80,BASE_CONFIG);
	strcpy(BASE_LOG,path);

	time_t mytime;
	struct tm * nowtime;
	time(&mytime );                
	nowtime = localtime(&mytime);
	char szTime[50];
	sprintf(szTime,"Base%02d%02d%02d.log",nowtime->tm_year+1900,
			nowtime->tm_mon+1,nowtime->tm_mday);

	strcat(BASE_LOG,szTime);
	
	char sqltype[20];
	if(GetPrivateProfileString("ODBC","SQLTYPE",BASE_SQLTYPE,sqltype,20,BASE_CONFIG) < 0)
		strcpy(sqltype,BASE_SQLTYPE);
	if(!strcmp(sqltype,"7.0"))
		b70sql=TRUE;
	else
		b70sql=FALSE;
		//b70sql=TRUE;

	memset(ConnArr,0,BASE_MAXCONN*sizeof(CONN));	//add by lsm
	
	max = atoi(maxc);

	RETCODE rc = SQLAllocEnv(&henv);
	if(rc!=SQL_SUCCESS)
		return FALSE;

	for(int i=0;i<max;i++)
	{
		SQLAllocConnect(henv,&(ConnArr[i].hdbc));
		ConnArr[i].conned = FALSE;
		ConnArr[i].usedf  = FALSE;
	}
	
	ConnInit();

#ifdef LOGON
	BaseLog(COMM,"wzBase.dll	v1.5(Last update:2000.04.06)",0);
	BaseLog(COMM,"wzBase initialization OK",0);
#endif
	return TRUE;
}

BOOL ExitDll()
{
	CloseHandle(hmutex);
	for(int i=0;i<max;i++)
	{
		if(ConnArr[i].conned)
		{
			SQLDisconnect(ConnArr[i].hdbc);
		}
		SQLFreeConnect(ConnArr[i].hdbc);
	}	
	SQLFreeEnv(henv);
	#ifdef LOGON
		BaseLog(COMM,"wzBase shutdown!",0);
	#endif
	return TRUE;
}

void DelPtr(int id)
{
	MyParams * m_para;
	m_para = &(ConnArr[id].para);
	m_para->bHasFet = FALSE;
	m_para->RowNum = 0;
	m_para->FetNum = 0;
}

BOOL SetPar(int id,pQuery pque)
{
	HSTMT m_hstmt;
	BYTE vt;
	BYTE io;
	BYTE len;
	DWORD io7;
	WORD len7;
	RETCODE m_rc;

	MyParams * para = &(ConnArr[id].para);

	SDWORD cbNTS,cbCol;
	cbNTS = SQL_NTS;

	strcpy(para->szFunction,pque->szFunction);

	m_rc = SQLAllocStmt(ConnArr[id].hdbc,&m_hstmt);
	m_rc = SQLBindParameter(m_hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,pque->szFunction,0,&cbNTS);
	if(!b70sql)
		m_rc = SQLExecDirect(m_hstmt,szGet65p,SQL_NTS);
	else
		m_rc = SQLExecDirect(m_hstmt,szGet70p,SQL_NTSL);
	
	if(!(m_rc == SQL_SUCCESS || m_rc == SQL_SUCCESS_WITH_INFO))
	{
		int errcode;
		errcode=DetErr(id,m_hstmt,m_rc);
		SQLFreeStmt(m_hstmt,SQL_DROP);
		/*   add by lsm 2000.4.5	*/
		if (errcode==4)	//非法句柄,猜想连接中断
		{
			SQLAllocConnect(henv,&(ConnArr[id].hdbc));
			ConnArr[id].conned = FALSE;
			ConnArr[id].usedf  = TRUE;
			ConnInit();	//连接重新初始化
		}
		//end of the add
		return FALSE;
	}

	int rowcount=0;

	if(!b70sql){
		SQLBindCol(m_hstmt,1,SQL_C_BINARY,&io,1,&cbCol);
		SQLBindCol(m_hstmt,2,SQL_C_BINARY,&vt,1,&cbCol);
		SQLBindCol(m_hstmt,3,SQL_C_BINARY,&len,1,&cbCol);
	}
	else{
		SQLBindCol(m_hstmt,1,SQL_C_SLONG,&io7,1,&cbCol);
		SQLBindCol(m_hstmt,2,SQL_C_BINARY,&vt,1,&cbCol);
		SQLBindCol(m_hstmt,3,SQL_C_SSHORT,&len7,1,&cbCol);
	}

	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);
			SQLFreeStmt(m_hstmt,SQL_DROP);
			return FALSE;
		}
		if(b70sql){
			para->pVarArr[rowcount].io =(BYTE)io7;
			para->pVarArr[rowcount].len = len7;
		}
		else
		{
			para->pVarArr[rowcount].io = io;
			para->pVarArr[rowcount].len = len;
		}
		switch(vt)
		{
			case SQLVARCHAR:
			case SQLCHARACTER:
				para->pVarArr[rowcount].vt = VT_PC;
				break;
			case SQLINT2:
				para->pVarArr[rowcount].vt = VT_PS;
				break;
			case SQLINT4:
				para->pVarArr[rowcount].vt = VT_PI;
				break;
			case SQLFLT8:
			case SQLMONEY:
			case SQLMONEY4:
			case SQLMONEYN:
				para->pVarArr[rowcount].vt = VT_PD;
				break;
			default:
				if(b70sql)
					para->pVarArr[rowcount].vt = VT_PI;
				else
					para->pVarArr[rowcount].vt = VT_PB;
				break;
		}			
		rowcount ++;
	}

	if(pque->prData.prCol.iColumn != rowcount)
	{
		//AfxMessageBox("存储过程参数个数不对");
		return FALSE;
	}
	SQLFreeStmt(m_hstmt,SQL_DROP);

	para->VarNum = pque->prData.prCol.iColumn;
	for(int m=0;m<rowcount;m++)
	{
		para->pVarArr[m].pcVal = pque->prData.prCol.Array[m];
	}
	return TRUE;
}

BOOL WINAPI OutExec(pQuery pque,pResult pres)
{
	int id;
	if((id = GetId()) < 0)
	{
		strcpy(pres->szErrMsg,"无连接可用");
		return FALSE;
	}

	if(!SetPar(id,pque))
	{
		ReleaseId(id);
		strcpy(pres->szErrMsg,"参数错误");
		return FALSE;
	}

	BOOL ret = Exec(id,pres);
	ReleaseId(id);

	return ret;
}

BOOL Exec(int id,pResult pres)
{
	UWORD  iotype;
	SDWORD cb0 = 0;
	SDWORD cbNTS = SQL_NTS;
	short sho;
	long  lon;
	double dou;
	HSTMT    m_hstmt;
	int      m_ret;
	RETCODE	 m_rc;
	char	 m_sqlstmt[200];
	char     m_procname[MAXLEN];     
	int      m_varnum;
	char	 msg[200];

	MyParams * m_para = &(ConnArr[id].para);

#ifdef LOGON
	sprintf(msg,"Exec %s ",m_para->szFunction); 
#endif

	m_para->bHasFet=FALSE;
	m_para->RowNum=0;
	m_para->FetNum=0;
	m_ret=0;

	m_rc = SQLAllocStmt(ConnArr[id].hdbc,&m_hstmt);
	m_rc = SQLBindParameter(m_hstmt,1,SQL_PARAM_OUTPUT,SQL_C_LONG,SQL_INTEGER,0,0,&m_ret,0,&cb0);

	strcpy(m_procname,m_para->szFunction);
	m_varnum=m_para->VarNum;
	strcpy(m_sqlstmt," { ?=call ");
	strcat(m_sqlstmt,m_procname);
	UWORD i;
	for(i=0;i<m_varnum;i++)
	{
		if(i==0)
		{
#ifdef LOGON
			strcat(msg,m_para->pVarArr[i].pcVal); 
#endif
			strcat(m_sqlstmt,"(?");
			if(i==m_varnum-1)
				strcat(m_sqlstmt,")");
		}
		else 
		{
#ifdef LOGON
			strcat(msg,",");
			strcat(msg,m_para->pVarArr[i].pcVal); 
#endif
			if	(i==m_varnum-1)
				strcat(m_sqlstmt,",?)");
			else
				strcat(m_sqlstmt,",?");
		}

		if(m_para->pVarArr[i].io==IO_IN)

⌨️ 快捷键说明

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