📄 sqlproc.cpp
字号:
}
e->Delete();
}*/
catch(...)
{
strcat(strfn,":打开时遇到未知异常!");
PostMsg(strfn);
return;
}
try
{
myfile.SeekToEnd();
char endchars[5];
sprintf(endchars,"%c",10);
strcat(strsql,endchars);
myfile.Write(strsql,strlen(strsql));
myfile.Close();
}
catch (CFileException* e)
{
sprintf(ts,"%s 写入异常:%d",e->m_strFileName,e->m_cause);
PostMsg(ts);
e->Delete();
myfile.Close();
}
catch(...)
{
strcat(strfn,"写入时遇到未知异常!");
PostMsg(strfn);
}
}
catch(...)
{
PostMsg("文件写入异常");
try
{
myfile.Close();
}
catch(CFileException* e)
{
sprintf(ts,"%s 文件关闭异常:%d",e->m_strFileName,e->m_cause);
PostMsg(ts);
e->Delete();
}
catch(...)
{
strcat(strfn,":关闭时遇到未知异常!");
PostMsg(strfn);
}
}
}
void CSqlProc::PostMsg(char *msg)
{ //在主界面显示字符串
sprintf(Sql_ProcMsg[curpos],"%s",msg);
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SHOWMSG);
curpos=(curpos+1)%SQLPROC_MAXQUEUE;
}
static VOID __stdcall ScanDatabase(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{ //时间响应函数
return;
}
void CSqlProc::OnTimer()
{
int ischange;
char* fbuff=NULL;
char sql[100];
if(m_dbok)
{
try //扫描字冠改动
{
sprintf(sql,"select ischange from dbo.CHANGE_FLAG");
SQLCloseCursor ( hOdbcStmt );
SQLFreeStmt ( hOdbcStmt, SQL_CLOSE );
ret = SQLExecDirect ( hOdbcStmt, (SQLCHAR *)sql, SQL_NTS );
if ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO )
{
SQLBindCol ( hOdbcStmt, 1, SQL_C_LONG, &ischange, sizeof(ischange), &x );
ret=SQLFetch ( hOdbcStmt);
if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
ret = SQLCloseCursor ( hOdbcStmt );
ret = SQLFreeStmt ( hOdbcStmt, SQL_CLOSE );
if(ischange==1) //字冠已改动,发出字冠更新信息
{
PostMsg("字冠改动!");
releaselink(zgb_fp);
if(!GetZgFromSQL())
GetZgFromFile();
}
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_WORKING); //向界面线程汇报其工作正常
}
else
{PostMsg("CHANGE_FLAG表为空");}
}
else
{
PostMsg("select ischange from dbo.CHANGE_FLAG执行失败!");
m_dbok=false;
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
}
}
catch(CDBException* e)
{
e->Delete();
m_dbok=false;
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
}
catch(...)
{
m_dbok=false;
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
}
//扫描字冠改动-END
}
else
{
//重新连接数据库
if(connectdb())
{
PostMsg("连接数据库成功,准备回写滞留的数据");
//遍历tempdata目录,读出所有暂存的文件
CFileFind ff;
CString strfn;
BOOL res=ff.FindFile("c:\\recsys\\tempdata\\*.*");
while(res)
{
res=ff.FindNextFile();
if(!ff.IsDirectory()&&!ff.IsDots())
{
strfn=ff.GetFilePath();
RestoreTempData(strfn);
}
}
ff.Close();
}
}
}
void CSqlProc::RestoreTempData(CString strfn)
{ //数据库恢复后把临时存在本地的数据写回数据库
CFile myfile;
CFileException fe;
char ts[500],tline[1024],fn[255];
char *fbuff=NULL,*tp=NULL,*tl=NULL;
long ti=0,haveread=0;
sprintf(fn,"%s",strfn);
try //打开文件
{
if(!myfile.Open(fn,CFile::modeRead,&fe))
{
if(fe.m_cause==CFileException::fileNotFound)
{
sprintf(ts,"%s 文件不存在",fe.m_strFileName);
PostMsg(ts);
m_restored=true;
return;
}
else if(fe.m_cause==CFileException::sharingViolation)
{
Sleep(1000);
if(!myfile.Open(fn,CFile::modeRead,&fe))
{
sprintf(ts,"%s 打开错误:%d",fe.m_strFileName,fe.m_cause);
PostMsg(ts);
m_restored=false;
return;
}
}
}
}
catch (CFileException* e)
{
sprintf(ts,"%s 打开异常:%d",e->m_strFileName,e->m_cause);
PostMsg(ts);
m_restored=false;
return;
}
catch(...)
{
PostMsg("临时数据库文件打开时遇到未知异常!");
m_restored=false;
return;
}
try //读入文件
{
fbuff=new char[1024*1024*10];
memset(fbuff,0,1024*1024*10);
haveread=myfile.ReadHuge(fbuff,1024*1024*10);
myfile.Close();
tp=fbuff;
ti=0;
}
catch (CFileException* e)
{
sprintf(ts,"%s 读入异常:%d",e->m_strFileName,e->m_cause);
PostMsg(ts);
e->Delete();
myfile.Close();
delete fbuff;
m_restored=false;
return;
}
catch(...)
{
PostMsg("滞留数据读取时发生未知的错误!");
try
{
if(fbuff)
delete fbuff;
myfile.Close();
}
catch(CFileException* e)
{
sprintf(ts,"%s 文件关闭异常:%d",e->m_strFileName,e->m_cause);
PostMsg(ts);
e->Delete();
}
catch(...)
{
PostMsg("tempsql.txt关闭时遇到未知异常!");
}
m_restored=false;
return;
}
while(tp!=0&&ti<haveread)
{
tl=tline;
memset(tline,0,1024);
while(*tp!=10&&ti<haveread)
{*tl=*tp;tp++;tl++;ti++;}
tp++;ti++;
//回写数据
try
{
m_database.ExecuteSQL(tline);
}
catch (CDBException* e)
{
// delete fbuff;
sprintf(ts,"回写滞留数据时,语句%s:%s",tline,e->m_strError);
PostMsg(ts);
e->Delete();
}
catch(...)
{
// delete fbuff;
sprintf(ts,"回写滞留数据时,语句%s:出现未知异常",tline);
PostMsg(ts);
}
//回写完毕
}
m_restored=true;
delete fbuff;
sprintf(ts,"完成滞留数据文件:%s 的写入",fn);
PostMsg(ts);
//删除滞留本地的数据文件
try
{
if(!DeleteFile(fn))
{
sprintf(ts,"%s--删除失败!",fn);
PostMsg(ts);
Sleep(500);
DeleteFile(fn);
}
}
catch (...)
{
sprintf(ts,"%s--删除异常!",fn);
PostMsg(ts);
return;
}
//删除滞留本地的数据文件-END
}
LRESULT CSqlProc::OnExeSql( WPARAM wParam,LPARAM lParam )
{
exesql(Sql_Command[wParam]);
return 0;
}
LRESULT CSqlProc::OnKillThread( WPARAM wParam,LPARAM lParam )
{
AfxEndThread(0);
return 0;
}
LRESULT CSqlProc::OnGetFtpQueue(WPARAM wParam, LPARAM lParam)
{
char ts[500];
char filename[255];
char curtime[30];
int groupid=0;
char sql[100];
//扫描FTP等待队列
try
{
sprintf(sql,"select curtime,filename,group_id,trytimes from dbo.FTP_QUEUE");
SQLCloseCursor ( hOdbcStmt );
SQLFreeStmt ( hOdbcStmt, SQL_CLOSE );
ret = SQLExecDirect ( hOdbcStmt, (SQLCHAR *)sql, SQL_NTS );
if ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO )
{
SQLBindCol ( hOdbcStmt, 1, SQL_C_CHAR, &curtime, sizeof(curtime), &x );
SQLBindCol ( hOdbcStmt, 2, SQL_C_CHAR, &filename, sizeof(filename), &x );
SQLBindCol ( hOdbcStmt, 3, SQL_C_LONG, &groupid, sizeof(groupid), &x );
// SQLBindCol ( hOdbcStmt, 4, SQL_C_LONG, &trytimes, sizeof(trytimes), &x );
ret=SQLFetch ( hOdbcStmt);
while(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
ret = SQLCloseCursor ( hOdbcStmt );
ret = SQLFreeStmt ( hOdbcStmt, SQL_CLOSE );
//有上传失败的文件,发出重新上传的命令
sprintf(Sql_ProcMsg[curpos],"e:\\rec\\%d\\%s",groupid,filename);
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_NEEDFTP);
curpos=(curpos+1)%SQLPROC_MAXQUEUE;
sprintf(sql,"delete from dbo.FTP_QUEUE where filename='%s' and group_id=%ld",filename,groupid);
ret=SQLExecDirect ( hOdbcStmt, (SQLCHAR *)sql, SQL_NTS );
ret=SQLFetch ( hOdbcStmt);
}
}
else
{
sprintf(ts,":%s执行失败!",sql);
PostMsg(ts);
m_dbok=false;
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
}
}
catch (...)
{
PostMsg("扫描FTP_QUEUE表时出现异常!");
m_dbok=false;
::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
}
//扫描FTP等待队列-END
return 0;
}
BOOL CSqlProc::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message) {
case WM_TIMER:
{
OnTimer();
}
break;
default: ;
}
return CWinThread::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -