📄 sqlproc.cpp
字号:
// SqlProc.cpp : implementation file
//
#include "stdafx.h"
#include "recsys.h"
#include "SqlProc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSqlProc
IMPLEMENT_DYNCREATE(CSqlProc, CWinThread)
CSqlProc::CSqlProc()
{
m_dbok=false;
hOdbcStmt=NULL;
x=0;
ret=0;
curpos=0;
}
CSqlProc::~CSqlProc()
{
try
{
if(m_database.IsOpen())
m_database.Close();
}
catch (CDBException* e)
{
e->Delete();
return;
}
catch(...)
{
return;
}
}
BOOL CSqlProc::InitInstance()
{
// TODO: perform and per-thread initialization here
mainwnd=NULL;
mainwnd=mainproc;
if(mainwnd==NULL)
return false;
//设置时钟HWND(this->m_hThread)
if(!connectdb()) ::PostMessage(mainwnd,WM_PROCMSG,0,SQLPROC_SERV_FAILD);
SetTimer(NULL,100,5*1000,NULL);
// SetTimer(HWND(this->m_hThread),100,5*1000,ScanDatabase);
//
if(!GetZgFromSQL()) GetZgFromFile();
return TRUE;
}
int CSqlProc::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CSqlProc, CWinThread)
//{{AFX_MSG_MAP(CSqlProc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_THREAD_MESSAGE( WM_EXESQL,OnExeSql )
ON_THREAD_MESSAGE( WM_KILLTHREAD,OnKillThread )
ON_THREAD_MESSAGE(WM_GETFTPQUEUE,OnGetFtpQueue)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSqlProc message handlers
void CSqlProc::exesql(char* sql)
{
CString ts;
int charind;
ts.Format("%s",sql);
charind=ts.Find("e:\\rec\\");
if(charind>=0)
ts.Delete(charind,11);
char strsql[1024];
sprintf(strsql,"%s",ts);
char errmsg[1024];
if(m_dbok)
{
try
{
m_database.ExecuteSQL(strsql);
}
catch (CDBException* e)
{
sprintf(errmsg,e->m_strError);
PostMsg(errmsg);
e->Delete();
m_dbok=false;
WriteSqlToFile(strsql);
}
catch(...)
{
PostMsg("SqlProc:SQL语句执行时遇到未知异常!");
m_dbok=false;
WriteSqlToFile(strsql);
}
}
else
{
WriteSqlToFile(strsql);
}
}
BOOL CSqlProc::connectdb()
{ //连接数据库,显示工作信息,影响m_dbok标志
char ts[300];
try
{
if(m_database.IsOpen())
m_database.Close();
if( m_database.OpenEx("DRIVER=SQL Server;SERVER=192.168.1.111;"
"UID=recsys;PWD=pass;"
"APP=Microsoft Data Access Components;;DSN=recsys",8))
{
SQLAllocHandle ( SQL_HANDLE_STMT,m_database.m_hdbc, &hOdbcStmt );
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_WORKING);
m_dbok=true;
m_restored=false;
PostMsg("SqlProc连接数据库成功");
return true;
}
m_dbok=false;
return false;
}
catch (CDBException* e)
{
sprintf(ts,e->m_strError);
PostMsg(ts);
m_dbok=false;
e->Delete();
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
return false;
}
catch(...)
{
PostMsg("SqlProc连接数据库时发生未知异常");
m_dbok=false;
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
return false;
}
}
void CSqlProc::releaselink(MEMZGB *fnod)
{
if(fnod->nextp!=NULL)
releaselink(fnod->nextp);
else
{
delete fnod;
return;
}
}
BOOL CSqlProc::GetZgFromSQL()
{
CDatabase m_db;
char zg[21];
int groupid;
char rec_folder[51];
SQLRETURN ret;
SQLHANDLE hOdbcStmt;
char msg[500];
long x;
// m_dbok=false;
try
{
try
{
m_dbok=m_db.OpenEx("DRIVER=SQL Server;SERVER=192.168.1.111;"
"UID=recsys;PWD=pass;"
"APP=Microsoft Data Access Components;;DSN=recsys",8);
}
catch (CDBException* e)
{
sprintf(msg,e->m_strError);
PostMsg(msg);
e->Delete();
m_dbok=false;
::InterlockedExchange(&ZG_Enable,0);
return false;
}
catch(...)
{
PostMsg("连接数据库时遇到未知异常!");
m_dbok=false;
::InterlockedExchange(&ZG_Enable,0);
return false;
}
if(m_dbok)
{ //数据库载入成功,读出字冠表,载入内存,写入文件
sumzg=0;
zgb_fp=NULL;
MEMZGB* tpnew,*tpold;
tpold=zgb_fp;
::InterlockedExchange(&ZG_Enable,0);
Sleep(50);
ret=SQLAllocHandle(SQL_HANDLE_STMT,m_db.m_hdbc,&hOdbcStmt);
ret = SQLExecDirect ( hOdbcStmt, (SQLCHAR *)"select zg,group_id,rec_floder from zgb", SQL_NTS );
ret=SQLBindCol ( hOdbcStmt, 1, SQL_C_CHAR, &zg, sizeof(zg), &x );
ret=SQLBindCol ( hOdbcStmt, 2, SQL_C_LONG, &groupid, sizeof(groupid), &x );
ret=SQLBindCol ( hOdbcStmt, 3, SQL_C_CHAR, &rec_folder, sizeof(rec_folder), &x );
ret = SQLFetch ( hOdbcStmt ) ;
while(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
tpnew=new MEMZGB;
if(tpold==NULL)
{
zgb_fp=tpnew;
tpold=tpnew;
}
sprintf(tpnew->zg,"%s",zg);sprintf(tpnew->rec_folder,"%s",rec_folder);
tpnew->groupid=groupid;tpold->nextp=tpnew;
tpnew->nextp=NULL;
tpold=tpnew;
ret = SQLFetch ( hOdbcStmt ) ;
sumzg++;
}
::InterlockedExchange(&ZG_Enable,1);
ret = SQLCloseCursor ( hOdbcStmt );
ret = SQLFreeStmt ( hOdbcStmt, SQL_CLOSE );
m_db.Close();
//把读出的字冠存入文件,可在数据库不可用时从文件读取;
CFile myfile;char buff[300];
if(myfile.Open("zgb",CFile::modeCreate|CFile::modeWrite,NULL))
{
tpnew=zgb_fp;
while(tpnew)
{
sprintf(buff,"%s,%d%c",tpnew->zg,tpnew->groupid,10);
myfile.Write(buff,strlen(buff));
tpnew=tpnew->nextp;
}
myfile.Close();
PostMsg("从数据库读取字冠表成功,已存入文件");
}
exesql("update CHANGE_FLAG set ischange=0");
return true;
// ::InterlockedExchange(&ZG_Enable,1);
}
else
{
return false;
// ::InterlockedExchange(&ZG_Enable,0);
}
}
catch (...)
{
PostMsg("字冠表读取或写入构建字冠链表时发生异常!");
m_dbok=false;
zgb_fp=NULL;
return false;
::InterlockedExchange(&ZG_Enable,0);
}
return true;
}
void CSqlProc::GetZgFromFile()
{
//从文件读出字冠表
CFile myfile;char *fbuff=new char[1024*1024];
char zg[20],strgid[10],log[255];
char *tp,*endchar;
int groupid=0;
m_dbok=false;
sumzg=0;
zgb_fp=NULL;
MEMZGB* tpnew,*tpold;
tpold=zgb_fp;
if(myfile.Open("zgb",CFile::modeRead,NULL))
{
memset(fbuff,0,1024*1024);
long zgblen=myfile.ReadHuge(fbuff,1024*1024);
myfile.Close();
tp=fbuff;
int i=0;
while((*tp!=0)&&(tp-fbuff<=zgblen))
{
i=0;
while(*tp!=',')
zg[i]=*tp,tp++,i++;
zg[i]=0;
i=0;
tp++;
while(*tp!=10)
strgid[i]=*tp,tp++,i++;
strgid[i]=0;tp++;
groupid=strtol(strgid,&endchar,10);
tpnew=new MEMZGB;
if(tpold==NULL)
{
zgb_fp=tpnew;
tpold=tpnew;
}
sprintf(tpnew->zg,"%s",zg);sprintf(tpnew->rec_folder,"");
tpnew->groupid=groupid;
sprintf(log,"Read ZG:%s,rec_folder:%s,groupid:%d",
tpnew->zg,tpnew->rec_folder,tpnew->groupid);
PostMsg(log);
tpold->nextp=tpnew;
tpnew->nextp=NULL;
tpold=tpnew;
sumzg++;
}
sprintf(log,"从文件读取字冠表成功!Read zg Sum:%d",sumzg);
PostMsg(log);
}
delete fbuff;
::InterlockedExchange(&ZG_Enable,1);
}
void CSqlProc::WriteSqlToFile(char *strsql)
{
CFile myfile;
CFileException fe;
SYSTEMTIME t;
GetLocalTime(&t);
char strfn[100];
sprintf(strfn,"tempdata\\%04d%02d%02d%02d.txt",t.wYear,t.wMonth,t.wDay,t.wHour);
char ts[300];
try
{
try
{
if(!myfile.Open(strfn,CFile::modeWrite,&fe))
{
if(fe.m_cause==CFileException::fileNotFound)
{
sprintf(ts,"%s 文件不存在",fe.m_strFileName);
PostMsg(ts);
if(!myfile.Open(strfn,CFile::modeWrite|CFile::modeCreate,&fe))
{
sprintf(ts,"%s 打开错误:%d",fe.m_strFileName,fe.m_cause);
PostMsg(ts);
}
}
}
}
/* catch (CFileException* e)
{
sprintf(ts,"%s 打开错误:%d",e->m_strFileName,e->m_cause);
PostMsg(ts);;
if(!myfile.Open("tempsql.txt",CFile::modeWrite|CFile::modeCreate,&fe))
{
sprintf(ts,"%s 打开错误:%d",fe.m_strFileName,fe.m_cause);
PostMsg(ts);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -