📄 wzbase.cpp
字号:
/*
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 + -