www.pudn.com > PBMS.rar > PBMSDoc.cpp


//==================================================================// 
//						此项目飞狼工作室制作 
//项 目 名:	PBMS 
//项目描述:	这是为了方便图书管理的软件。    功能特点:多用户、信息保密、还书提醒、资料保存。 
//作   者:	龚勋 
//日  期:  2003-11-14 
//-=================================================================// 
// PBMSDoc.cpp : implementation of the CPBMSDoc class 
// 
 
#include "stdafx.h" 
#include "PBMS.h" 
 
#include "PBMSDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSDoc 
//*==============静态数据初始化=====================*// 
int	CPBMSDoc::BookID = 0; 
int CPBMSDoc::UserID = 0; 
int CPBMSDoc::LibID  = 0; 
CString CPBMSDoc::AlertSoundPath = _T(""); 
//*=================================================*// 
IMPLEMENT_DYNCREATE(CPBMSDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CPBMSDoc, CDocument) 
	//{{AFX_MSG_MAP(CPBMSDoc) 
	ON_COMMAND(ID_USER_ADD, OnUserAdd) 
	ON_COMMAND(ID_USER_DEL, OnUserDel) 
	ON_COMMAND(ID_LIB_ADD, OnLibAdd) 
	ON_COMMAND(ID_LIB_DEL, OnLibDel) 
	ON_COMMAND(ID_SYS_CHANGEADMIN, OnSysChangeadmin) 
	ON_COMMAND(ID_SYS_LOGONOUT, OnSysLogonout) 
	ON_COMMAND(ID_SCANBOOKS, OnScanbooks) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSDoc construction/destruction 
/*=========================构造函数================================================== 
				  在这里实现数据库的连接过程 
====================================================================================*/ 
CPBMSDoc::CPBMSDoc() 
{ 
	//*===============首先指定数据库存放路径============*// 
	char dbpath[128];						//数据库Path 
	::GetModuleFileName(NULL,dbpath,128);	//获取路径 
	int index,i=0; 
	 
	while(dbpath[i] != '\0') 
	{ 
		if( dbpath[i] == '\\' ) 
		{ 
			index = i; 
		} 
		i ++ ; 
	} 
	char *filename = "PBMS_DB.mdb"; 
	while ( *filename != '\0') 
	{ 
		dbpath[++index] = *filename; 
		filename ++; 
	} 
	dbpath[++index] = '\0';  //添加字符串结束符 
	//*=================================================*// 
 
	//*=====================连接数据库==================*// 
	if (!m_adoConnection.ConnectAccess(dbpath,"aa"))// aa是密码 
	{ 
		AfxMessageBox("1-数据库连接失败!"); 
		return; 
	} 
	//*=================================================*// 
 
	//*打开users及lib表并把数据读入,便于界面初始化工作 *// 
	m_adoRecordSet.SetAdoConnection(&m_adoConnection); 
	if (!m_adoRecordSet.SetCursorLocation()) 
	{ 
		AfxMessageBox("2-SetCursorLocation失败!"); 
		return; 
	} 
	//从users表中读数据,结果存放在m_saUsersName和m_saUsersID对象中, 
	//注:不需显示地打开与关闭表,一切都封装在函数内部 
	m_adoRecordSet.Get_ID_Info_Array("users",m_saUsersName,2,m_uaUsersID); 
	//根据用户数量设置已登录用户ID数组的最大值 
	m_LogonUserID.SetSize(m_uaUsersID.GetSize()); 
	//从lib表中读数据,结果存放在m_saLibsName和m_saLibsID对象中, 
	m_adoRecordSet.Get_ID_Info_Array("lib",m_saLibsName,2,m_uaLibsID); 
	//*=================================================*// 
 
	//*==============获取各种表的ID号===================*// 
	//用户当前最大ID 
	if (m_uaUsersID.GetSize() == 0) 
	{ 
		UserID = 0; 
	} 
	else 
	{ 
		UserID = m_uaUsersID.GetAt(m_uaUsersID.GetSize() - 1); 
	} 
	//图书馆当前最大ID 
	if (m_uaLibsID.GetSize() == 0) 
	{ 
		LibID = 0; 
	} 
	else 
	{ 
		LibID = m_uaLibsID.GetAt(m_uaLibsID.GetSize() - 1); 
	} 
	//书籍当前最大ID 
	if (!m_adoRecordSet.Open("select * from books order by ID")) 
	{ 
		AfxMessageBox("22-Open数据集失败!"); 
	} 
	if (m_adoRecordSet.IsEOF()) 
	{ 
		BookID = 0;		//书籍数据库为空则设定ID为0 
	} 
	else 
	{ 
		if (!m_adoRecordSet.MoveLast()) 
		{ 
			AfxMessageBox("23-数据集MoveLast失败!"); 
		} 
		if (!m_adoRecordSet.GetCollect("ID",BookID)) 
		{ 
			AfxMessageBox("24-数据集GetCollect失败!"); 
		} 
	} 
	m_adoRecordSet.Close(); 
	//*=================================================*// 
	m_curDataType = 0;	//数据集数据类型 
	//*==============获取管理员ID及密码=================*// 
	m_adoRecordSet.Open("select * from users \ 
						 where 是否管理员 = true"); 
	if (m_adoRecordSet.IsEOF()) 
	{ 
		m_managerID = 0;	 
	} 
	else 
	{ 
		m_adoRecordSet.GetCollect("ID",m_managerID); 
		m_adoRecordSet.GetCollect("密码",m_managerPass); 
	} 
	//*=================================================*//	 
	//获取声音路径 
	GetSoundPath(); 
	//扫描超期图书 
	ScanBooks(false);	//没有超期图书则不警告 
} 
 
/*=========================析构函数================================================== 
					释放数据库连接资源 
====================================================================================*/ 
CPBMSDoc::~CPBMSDoc() 
{ 
	m_adoRecordSet.Close(); 
	m_adoConnection.Close(); 
} 
 
BOOL CPBMSDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSDoc serialization 
 
void CPBMSDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSDoc diagnostics 
 
#ifdef _DEBUG 
void CPBMSDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CPBMSDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CPBMSDoc commands 
/*=========================SaveName=================================================== 
说明: 
	当前用户在左边树型控件中修改名字后,调用此函数 
	在数据库中进行保存。 
参数: 
	szTableName :	表名,因该函数既可以修改"users"表,也可以修改"lib"表 
	szID		:	要修改列的关键字 
	szName		:	要修改的值 
====================================================================================*/ 
BOOL CPBMSDoc::SaveName(LPCTSTR szTableName, DWORD ID, LPCTSTR szName) 
{ 
	CString szNewName = szName; 
	CString Table = szTableName; 
	int		id = (int)ID; 
	//*==============构造查询语句=======================*// 
	CString	szQuery; 
	szQuery.Format("select * from %s where ID = %d",Table.GetBuffer(0),id); 
	Table.ReleaseBuffer(); 
	//*=================================================*//	 
 
	//*==============修改数据库中的数据=================*// 
	//打开数据集 
	if (!m_adoRecordSet.Open(szQuery)) 
	{ 
		AfxMessageBox("4-打开表出错!"); 
		return FALSE; 
	} 
	//PutCollect()之后一定要调用Update()方法,参数1就是指 
	//第2列,因数据表从0列开始 
	if (!m_adoRecordSet.PutCollect(1,szNewName)) 
	{ 
		AfxMessageBox("5-修改表数据出错!"); 
		return FALSE; 
	} 
	if (!m_adoRecordSet.Update()) 
	{ 
		AfxMessageBox("6-更新表数据出错!"); 
		return FALSE;	 
	} 
	//关闭数据集 
	m_adoRecordSet.Close(); 
	//*=================================================*//	 
	return TRUE; 
} 
/*=========================GetDataAndShow============================================= 
说明: 
	本函数用来从数据库读取数据,并根据参数wParam的值显示相应的 
	面板,后者功能的实现通过向右边的View发送消息WM_SHOWRIGHTBAR 
参数: 
	wParam = 1:显示用户信息面板 
	wParam = 2:显示所借书籍面板 
	wParam = 3:显示已还书籍面板 
	wParam = 4:显示图书馆信息面板 
	wParam = 5:显示系统信息及设置面板 
 
	IsGetFromDB:true :从数据库读取数据 
	IsGetFromDB:false:不从数据库读取数据 
====================================================================================*/ 
BOOL CPBMSDoc::GetDataAndShow(int wParam,bool IsGetFromDB) 
{ 
	CString szSQL; 
	int index = wParam; 
	switch(index) 
	{ 
	case 1:	//显示用户信息面板 
		{ 
			if (IsGetFromDB) 
			{ 
				//***======首先读取用户信息========***// 
				//构造查询语句 
				szSQL.Format("select * from users \ 
							  where ID = %d", 
							  m_curUserInfo.Id); 
				MyUpdateData(szSQL,1,false); 
				//***==============================***// 
				m_IsNewUser = false; 
			} 
			//*==============安全代码============================*// 
			for (int i = 0; i < m_LogonUserID.GetSize(); i ++) 
			{ 
				//如果用户已经登录或是管理员已经登录 
				if (m_curUserInfo.Id == m_LogonUserID.GetAt(i) || m_LogonUserID.GetAt(i) == m_managerID) 
				{ 
					//如果已经登录则让其正常显示 
					AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,0);//最后一个参数表明显示模式,0-正常 1-不可写 
					m_curDataType = 1; 
					return TRUE; 
				} 
			}//end-for 
			//如果用户尚未登录且管理员未登录 
			if (m_curUserInfo.safelevel == 0 || m_IsNewUser ) 
			{ 
				m_LogonUserID.Add(m_curUserInfo.Id); 
				AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,0);//最后一个参数表明显示模式,0-正常 1-不可写 
			} 
			else if (m_curUserInfo.safelevel == 1) 
			{ 
				AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,1);//最后一个参数表明显示模式,0-正常 1-不可写 
			} 
			else if (m_curUserInfo.safelevel == 2) 
			{ 
				if (SafeGate()) 
				{ 
					AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)1,0);//最后一个参数表明显示模式,0-正常 1-不可写 
				} 
				else 
				{ 
					return FALSE;//登录不成功 
				} 
			} 
			//*=================================================*// 
			//设置数据类型 
			m_curDataType = 1; 
			break; 
		} 
			 
	case 2:	//显示所借书籍面板 
		{ 
			//***======首先读取已借书籍信息====***// 
			//构造查询语句 
			szSQL.Format("select * from BookView \ 
						  where UserID = %d \ 
						  and 已还 = false \ 
						  order by ID", 
						  m_curUserInfo.Id); 
			MyUpdateData(szSQL,2,false); 
			//***==============================***// 
			//***======然后读取用户信息========***// 
			//构造查询语句 
			szSQL.Format("select * from users \ 
						  where ID = %d", 
						  m_curUserInfo.Id); 
			MyUpdateData(szSQL,1,false); 
			//***==============================***// 
 
			//*==============安全代码============================*// 
			for (int i = 0; i < m_LogonUserID.GetSize(); i ++) 
			{ 
				//如果用户已经登录或是管理员已经登录 
				if (m_curUserInfo.Id == m_LogonUserID.GetAt(i) || m_LogonUserID.GetAt(i) == m_managerID) 
				{ 
					//如果已经登录则让其正常显示 
					AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,0);//最后一个参数表明显示模式,0-正常 1-不可写 
					m_curDataType = 2; 
					return TRUE; 
				} 
			}//end-for 
			//如果用户尚未登录且管理员未登录 
			if (m_curUserInfo.safelevel == 0) 
			{ 
				m_LogonUserID.Add(m_curUserInfo.Id); 
				AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,0);//最后一个参数表明显示模式,0-正常 1-不可写 
			} 
			else if (m_curUserInfo.safelevel == 1) 
			{ 
				AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,1);//最后一个参数表明显示模式,0-正常 1-不可写 
			} 
			else if (m_curUserInfo.safelevel == 2) 
			{ 
				if (SafeGate()) 
				{ 
					AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)2,0);//最后一个参数表明显示模式,0-正常 1-不可写 
				} 
				else 
				{ 
					return FALSE;//登录不成功 
				} 
			} 
			//*=================================================*// 
			//设置数据集类型 
			m_curDataType = 2; 
			break; 
		} 
	case 3:	//显示已还书籍面板 
		{ 
			//***======首先读取已还书籍信息====***// 
			szSQL.Format("select * from BookView \ 
						  where UserID = %d \ 
						  and 已还 = true \ 
						  order by ID", 
						  m_curUserInfo.Id); 
			MyUpdateData(szSQL,2,false); 
			//***==============================***// 
			//***======然后读取用户信息========***// 
			//构造查询语句 
			szSQL.Format("select * from users \ 
						  where ID = %d", 
						  m_curUserInfo.Id); 
			MyUpdateData(szSQL,1,false); 
			//***==============================***// 
 
			//*==============安全代码============================*// 
			for (int i = 0; i < m_LogonUserID.GetSize(); i ++) 
			{ 
				//如果用户已经登录或是管理员已经登录 
				if (m_curUserInfo.Id == m_LogonUserID.GetAt(i) || m_LogonUserID.GetAt(i) == m_managerID) 
				{ 
					//如果已经登录则让其正常显示 
					AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,0);//最后一个参数表明显示模式,0-正常 1-不可写 
					m_curDataType = 3; 
					return TRUE; 
				} 
			}//end-for 
			//如果用户尚未登录且管理员未登录 
			if (m_curUserInfo.safelevel == 0) 
			{ 
				m_LogonUserID.Add(m_curUserInfo.Id); 
				AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,0);//最后一个参数表明显示模式,0-正常 1-不可写 
			} 
			else if (m_curUserInfo.safelevel == 1) 
			{ 
				AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,1);//最后一个参数表明显示模式,0-正常 1-不可写 
			} 
			else if (m_curUserInfo.safelevel == 2) 
			{ 
				if (SafeGate()) 
				{ 
					AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)3,0);//最后一个参数表明显示模式,0-正常 1-不可写 
				} 
				else 
				{ 
					return FALSE;//登录不成功 
				} 
			} 
			//*=================================================*// 
			//设置数据类型 
			m_curDataType = 3; 
			break; 
		} 
	case 4:	//显示图书馆信息面板 
		{ 
			if (IsGetFromDB) 
			{ 
				//***======首先读取图书馆信息======***// 
				szSQL.Format("select * from Lib \ 
							  where ID = %d \ 
							  order by ID", 
							  m_curLibInfo.id); 
				MyUpdateData(szSQL,3,false); 
				//***==============================***// 
			} 
			//设置数据类型 
			m_curDataType = 4; 
			AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)4,0); 
			break; 
		} 
	case 5:	//显示系统信息及设置面板 
		{ 
			//设置数据类型 
			m_curDataType = 0;			 
			AfxGetMainWnd()->SendMessageToDescendants(WM_SHOWRIGHTBAR,(WPARAM)5,0); 
			break; 
		} 
	default: 
		{ 
			AfxMessageBox("8-WM_SHOWRIGHTBAR消息参数出错!"); 
			break; 
		} 
	}//end-switch 
	return TRUE; 
} 
 
/*=========================MyUpdateData=============================================== 
说明: 
	此函数实现从数据库中读取数据或保存数据的功能。 
参数: 
	strSQL	  :			查询语句 
	whichTable:	1		读取或保存用户信息 
				2		读取或保存书籍信息 
				3		读取或保存图书馆信息 
	save	  : true	保存数据 
				false	读取数据 
====================================================================================*/ 
BOOL CPBMSDoc::MyUpdateData(LPCTSTR strSQL,int whichTable, bool save) 
{ 
	//测试数据 
	CString s; 
	//数据 
	CString		photoField;		//相片域名 
	long		picLength = 0;	//相片数据长度 
	BOOKINFO	bookinfo;		//书籍信息 
	int			bookcount = 0;	//书籍数目 
	//有效性检查 
	if (whichTable < 1 || whichTable > 3) 
	{ 
		AfxMessageBox("10-数据表序号不对!"); 
		return FALSE; 
	} 
	//*==============获取左视图对象指针=================*// 
	POSITION pos = GetFirstViewPosition(); 
	CView* pView; 
	while (pos) 
	{ 
		pView = GetNextView(pos); 
		if (pView->IsKindOf(RUNTIME_CLASS(CLeftView))) 
		{ 
			break; 
		} 
	} 
	CLeftView *pLeftView = (CLeftView *)pView; 
	//*=================================================*// 
	//*==============访问数据库=========================*// 
	//首先关闭数据表 
	m_adoRecordSet.Close(); 
	//打开数据表 
	if (!m_adoRecordSet.Open(strSQL)) 
	{ 
		AfxMessageBox("11-数据集Open失败!"); 
		return FALSE; 
	}			 
	switch(whichTable) 
	{ 
	case 1:	//用户信息 
		 { 
			if(save)	//保存 
			{ 
				if (!m_adoRecordSet.PutCollect("ID",m_curUserInfo.Id ) 
				  ||!m_adoRecordSet.PutCollect(1,m_curUserInfo.name ) 
				  ||!m_adoRecordSet.PutCollect(2,m_curUserInfo.sex ) 
				  ||!m_adoRecordSet.PutCollect(3,m_curUserInfo.age ) 
				  ||!m_adoRecordSet.PutCollect(4,m_curUserInfo.knowID ) 
				  ||!m_adoRecordSet.PutCollect(5,m_curUserInfo.identID ) 
				  ||!m_adoRecordSet.PutCollect(6,m_curUserInfo.CardNumber )	 
				  ||!m_adoRecordSet.PutCollect(7,m_curUserInfo.address ) 
				  ||!m_adoRecordSet.PutCollect(8,m_curUserInfo.pass ) 
				  ||!m_adoRecordSet.PutCollect(10,m_curUserInfo.safelevel ) 
				  ||!m_adoRecordSet.PutCollect(11,m_curUserInfo.IsAlert ) 
				  ||!m_adoRecordSet.PutCollect(12,m_curUserInfo.days ) 
				  ||!m_adoRecordSet.PutCollect(13,m_curUserInfo.IsAdmin ) 
				  ||!m_adoRecordSet.PutCollect(14,m_curUserInfo.photo.Width ) 
				  ||!m_adoRecordSet.PutCollect(15,m_curUserInfo.photo.Height )) 
				{ 
					AfxMessageBox("16-保存用户数据失败!"); 
					m_adoRecordSet.Close();//关闭数据集users 
					return FALSE; 
				} 
				//***======保存相片数据============***// 
				if (m_curUserInfo.photo.Path.GetLength() != 0) 
				{ 
					photoField = _T("相片"); 
					if (!m_adoRecordSet.AppendChunk(photoField,m_curUserInfo.photo.Path)) 
					{ 
						AfxMessageBox("17-保存用户相片失败!"); 
						m_adoRecordSet.Close();//关闭数据集users 
						return FALSE; 
					} 
				} 
				//***==============================***// 
 
				//***======删除相片数据============***// 
				if (m_curUserInfo.photo.Width == 0 && m_curUserInfo.photo.hasPhoto == true) 
				{ 
					photoField = _T("相片"); 
					if (!m_adoRecordSet.DeletePicture(photoField)) 
					{ 
						AfxMessageBox("18-删除用户相片失败!"); 
						m_adoRecordSet.Close();//关闭数据集users 
						return FALSE; 
					} 
				} 
				//***==============================***// 
 
				if (!m_adoRecordSet.Update()) 
				{ 
					AfxMessageBox("6-更新表数据出错!"); 
					m_adoRecordSet.Close();//关闭数据集users 
					return FALSE;	 
				} 
				m_adoRecordSet.Close();//关闭数据集users 
				//修改用户名显示 
				pLeftView->ModifyName(); 
			}//end-if (save) 
			else		//读取 
			{ 
				if (!m_adoRecordSet.GetCollect("ID",m_curUserInfo.Id) 
				  ||!m_adoRecordSet.GetCollect(1,m_curUserInfo.name ) 
				  ||!m_adoRecordSet.GetCollect(2,m_curUserInfo.sex ) 
				  ||!m_adoRecordSet.GetCollect(3,m_curUserInfo.age ) 
				  ||!m_adoRecordSet.GetCollect(4,m_curUserInfo.knowID ) 
				  ||!m_adoRecordSet.GetCollect(5,m_curUserInfo.identID ) 
				  ||!m_adoRecordSet.GetCollect(6,m_curUserInfo.CardNumber )	 
				  ||!m_adoRecordSet.GetCollect(7,m_curUserInfo.address ) 
				  ||!m_adoRecordSet.GetCollect(8,m_curUserInfo.pass ) 
				  ||!m_adoRecordSet.GetCollect(10,m_curUserInfo.safelevel ) 
				  ||!m_adoRecordSet.GetCollect(11,m_curUserInfo.IsAlert ) 
				  ||!m_adoRecordSet.GetCollect(12,m_curUserInfo.days ) 
				  ||!m_adoRecordSet.GetCollect(13,m_curUserInfo.IsAdmin ) 
				  ||!m_adoRecordSet.GetCollect(14,m_curUserInfo.photo.Width ) 
				  ||!m_adoRecordSet.GetCollect(15,m_curUserInfo.photo.Height )) 
				{ 
					AfxMessageBox("12-读取用户数据失败!"); 
					m_adoRecordSet.Close();//关闭数据集users 
					return FALSE; 
				} 
				//***======读取相片数据============***// 
				//文件长度 
				picLength = m_adoRecordSet.GetFieldActualSize(9); 
				m_curUserInfo.photo.pdata = NULL; 
				m_curUserInfo.photo.len = 0; 
				m_curUserInfo.photo.hasPhoto = false; 
				if (picLength != -1 && picLength != 0) 
				{ 
					m_curUserInfo.photo.pdata = new BYTE[picLength]; 
					m_curUserInfo.photo.len = picLength; 
					m_curUserInfo.photo.hasPhoto = true;	//原来有相片 
					if (!m_adoRecordSet.GetChunk(9,m_curUserInfo.photo.pdata)) 
					{ 
						AfxMessageBox("13-读取用户相片失败!"); 
						m_adoRecordSet.Close();//关闭数据集users 
						return FALSE; 
					} 
				} 
				//***==============================***// 
				m_adoRecordSet.Close();//关闭数据集users 
				//从knowledge表中读数据,结果存放在m_uaKnowLevID和m_saKnowLevel对象中, 
				m_saKnowLevel.RemoveAll(); 
				m_uaKnowLevID.RemoveAll(); 
				m_adoRecordSet.Get_ID_Info_Array("knowledge",m_saKnowLevel,2,m_uaKnowLevID); 
				//从identities表中读数据,结果存放在m_uaIdentyID和m_saIdentity对象中, 
				m_saIdentity.RemoveAll(); 
				m_uaIdentyID.RemoveAll(); 
				m_adoRecordSet.Get_ID_Info_Array("identities",m_saIdentity,2,m_uaIdentyID); 
			}//end-else //读取 
			break; 
		 }//end-case1 
	case 2:	//书籍信息 
		 { 
			if(save)	//保存 
			{ 
				//***==先将数据集清空,然后将数据写入===***// 
				//清空数据 
				while(!m_adoRecordSet.IsEOF()) 
				{ 
					m_adoRecordSet.Delete(); 
					m_adoRecordSet.MoveNext(); 
				} 
				//写新数据 
				for(bookcount  = 0; bookcount < m_userBooks.GetSize(); bookcount ++) 
				{ 
					m_adoRecordSet.AddNew(); 
					bookinfo = m_userBooks.GetAt(bookcount); 
					if (!m_adoRecordSet.PutCollect("ID",bookinfo.Id ) 
						||!m_adoRecordSet.PutCollect(1,bookinfo.name ) 
						||!m_adoRecordSet.PutCollect(2,bookinfo.bookNumber ) 
						||!m_adoRecordSet.PutCollect(3,bookinfo.IsLiterature ) 
						||!m_adoRecordSet.PutCollect(4,bookinfo.LibID ) 
						||!m_adoRecordSet.PutCollect(7,bookinfo.UserID ) 
						||!m_adoRecordSet.PutCollect(8,bookinfo.IsReturn ) 
						||!m_adoRecordSet.PutCollect(9,bookinfo.reborrowCount )) 
					{ 
						AfxMessageBox("21-保存书籍信息失败!"); 
						m_adoRecordSet.Close();//关闭数据集 
						return FALSE; 
					}//end-if 
					//***======对时间保存专门处理======***// 
					//时间未设置,则不保存,否则系统会自动保存1899-12-30这样的日期 
					if (bookinfo.borrowTime.m_status != 2) 
					{ 
						m_adoRecordSet.PutCollect(5,bookinfo.borrowTime); 
					} 
					if (bookinfo.reborrowTime.m_status != 2) 
					{ 
						m_adoRecordSet.PutCollect(6,bookinfo.reborrowTime); 
					} 
					if (bookinfo.returnTime.m_status != 2) 
					{ 
						m_adoRecordSet.PutCollect(10,bookinfo.returnTime); 
					} 
					//***==============================***//					 
 
				}//end-for 
				m_adoRecordSet.Update();	//更新数据库 
				m_adoRecordSet.Close();		//关闭数据集books 
				//***===================================***// 
			}//end-if	//保存 
			else		//读取 
			{ 
				m_userBooks.RemoveAll();		//首先清空数组 
				bookcount = (int)m_adoRecordSet.GetRecordCount(); 
				if (bookcount != 0) 
				{ 
					m_userBooks.SetSize(bookcount);	//设置数组长度 
					bookcount = 0;					//将其置0,以便做队列序号之用 
				} 
				while(!m_adoRecordSet.IsEOF()) 
				{ 
					if (!m_adoRecordSet.GetCollect("ID",bookinfo.Id ) 
						||!m_adoRecordSet.GetCollect(1,bookinfo.name ) 
						||!m_adoRecordSet.GetCollect(2,bookinfo.bookNumber ) 
						||!m_adoRecordSet.GetCollect(3,bookinfo.IsLiterature ) 
						||!m_adoRecordSet.GetCollect(4,bookinfo.borrowTime ) 
						||!m_adoRecordSet.GetCollect(5,bookinfo.reborrowTime ) 
						||!m_adoRecordSet.GetCollect(6,bookinfo.reborrowCount ) 
						||!m_adoRecordSet.GetCollect(7,bookinfo.UserID ) 
						||!m_adoRecordSet.GetCollect(8,bookinfo.IsReturn ) 
						||!m_adoRecordSet.GetCollect(9,bookinfo.returnTime ) 
						||!m_adoRecordSet.GetCollect(10,bookinfo.LibID ) 
						||!m_adoRecordSet.GetCollect(11,bookinfo.LibName ) 
						||!m_adoRecordSet.GetCollect(12,bookinfo.canborrowTime ) 
						||!m_adoRecordSet.GetCollect(13,bookinfo.canreborrowTime ) 
						||!m_adoRecordSet.GetCollect(14,bookinfo.HasHoliday ) 
						||!m_adoRecordSet.GetCollect(15,bookinfo.holiday_begin ) 
						||!m_adoRecordSet.GetCollect(16,bookinfo.holiday_end )) 
					{ 
						AfxMessageBox("19-读取书籍信息失败!"); 
						m_adoRecordSet.Close();//关闭数据集 
						return FALSE; 
					}//end-if 
					//如果没有还书,则调用函数计算应还书时间 
					if (!bookinfo.IsReturn) 
					{ 
						GetReturnTime(&bookinfo); 
					} 
					//将数据保存到队列中 
					m_userBooks.SetAt(bookcount++,bookinfo); 
					if (!m_adoRecordSet.MoveNext()) 
					{ 
						AfxMessageBox("20-数据集指针后移失败!"); 
						m_adoRecordSet.Close();//关闭数据集 
						return FALSE; 
					}// 
				}//end-while 
				m_adoRecordSet.Close();//关闭数据集BookView 
				//*==============将所有图书馆信息读取===============*// 
				LIBINFO	libinfo; 
				BOOL b = m_adoRecordSet.Open("select * from lib order by ID"); 
				int libcount = (int)m_adoRecordSet.GetRecordCount(); 
				if (libcount != 0) 
				{ 
					m_libsInfo.SetSize(libcount);	//设置数组长度 
					libcount = 0;					//将其置0,以便做队列序号之用 
				} 
				while(!m_adoRecordSet.IsEOF()) 
				{ 
					if (!m_adoRecordSet.GetCollect("ID",libinfo.id ) 
						||!m_adoRecordSet.GetCollect(1,libinfo.name ) 
						||!m_adoRecordSet.GetCollect(2,libinfo.canborrowTime ) 
						||!m_adoRecordSet.GetCollect(3,libinfo.canreborrowTime ) 
						||!m_adoRecordSet.GetCollect(6,libinfo.HasHoliday ) 
						||!m_adoRecordSet.GetCollect(7,libinfo.holiday_begin ) 
						||!m_adoRecordSet.GetCollect(8,libinfo.holiday_end )) 
					{ 
						AfxMessageBox("25-读取图书馆信息失败!"); 
					}//end-if 
					//将数据保存到队列中 
					m_libsInfo.SetAt(libcount ++,libinfo); 
					if (!m_adoRecordSet.MoveNext()) 
					{ 
						AfxMessageBox("26-数据集指针后移失败!"); 
					}// 
				}//end-while 
				//*=================================================*// 
			}//end-else	//读取 
			break; 
		 }//end-case2 
	case 3:	//图书馆信息 
		 { 
			if(save) 
			{ 
				if (!m_adoRecordSet.PutCollect("ID",m_curLibInfo.id ) 
					||!m_adoRecordSet.PutCollect(1,m_curLibInfo.name ) 
					||!m_adoRecordSet.PutCollect(2,m_curLibInfo.canborrowTime ) 
					||!m_adoRecordSet.PutCollect(3,m_curLibInfo.canreborrowTime ) 
					||!m_adoRecordSet.PutCollect(4,m_curLibInfo.canreborrowCount ) 
					||!m_adoRecordSet.PutCollect(5,m_curLibInfo.maxbookCount ) 
					||!m_adoRecordSet.PutCollect(6,m_curLibInfo.HasHoliday )) 
				{ 
					AfxMessageBox("28-保存图书馆信息失败!"); 
					m_adoRecordSet.Close();//关闭数据集 
					return FALSE; 
				}//end-if 
				//***======对假期时间单独保存======***// 
				if (m_curLibInfo.holiday_begin.m_status != 2) 
				{ 
					m_adoRecordSet.PutCollect(7,m_curLibInfo.holiday_begin); 
				} 
				if (m_curLibInfo.holiday_end.m_status != 2) 
				{ 
					m_adoRecordSet.PutCollect(8,m_curLibInfo.holiday_end); 
				} 
				//***==============================***// 
				m_adoRecordSet.Update();	//更新数据库 
				m_adoRecordSet.Close();		//关闭数据集 
				//修改馆名显示 
				pLeftView->ModifyName(false); 
			}//end-if(save) 
			else 
			{ 
				if (!m_adoRecordSet.GetCollect("ID",m_curLibInfo.id ) 
					||!m_adoRecordSet.GetCollect(1,m_curLibInfo.name ) 
					||!m_adoRecordSet.GetCollect(2,m_curLibInfo.canborrowTime ) 
					||!m_adoRecordSet.GetCollect(3,m_curLibInfo.canreborrowTime ) 
					||!m_adoRecordSet.GetCollect(4,m_curLibInfo.canreborrowCount ) 
					||!m_adoRecordSet.GetCollect(5,m_curLibInfo.maxbookCount ) 
					||!m_adoRecordSet.GetCollect(6,m_curLibInfo.HasHoliday ) 
					||!m_adoRecordSet.GetCollect(7,m_curLibInfo.holiday_begin ) 
					||!m_adoRecordSet.GetCollect(8,m_curLibInfo.holiday_end )) 
				{ 
					AfxMessageBox("27-读取图书馆信息失败!"); 
					m_adoRecordSet.Close();//关闭数据集 
					return FALSE; 
				}//end-if 
				m_adoRecordSet.Close();//关闭数据集	 
			}//end-else	//读取 
			break;			 
		 }//end-case3 
	default : 
		AfxMessageBox("9-不明访问数据库失败!"); 
		m_adoRecordSet.Close();//关闭数据集 
		return FALSE; 
	}//end-switch 
	//*=================================================*// 
 
	return TRUE; 
} 
 
/*=========================GetReturnTime============================================== 
说明: 
	获取还书时间,日后图书馆制度变更后,程序修改只需在此模块进行 
参数: 
	pBI:书籍的所有信息,返回值也在其中的shouldReTime字段中 
 
====================================================================================*/ 
void CPBMSDoc::GetReturnTime(PBOOKINFO pBI) 
{ 
	//中间变量 
	CTime t_borrow,t_reborrow; 
	t_borrow = CTime(pBI->borrowTime.GetYear(),pBI->borrowTime.GetMonth(),pBI->borrowTime.GetDay(),0,0,0); 
	// 
	if (pBI->reborrowCount == 0)//没有续借过 
	{ 
		//如果没有时间则无法计算还书时间 
		if (pBI->borrowTime.m_status == 2) 
		{ 
			pBI->shouldReTime = CTime(1970,12,30,0,0,0); 
			return; 
		} 
//		CTimeSpan t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0); 
		CTimeSpan t_span; 
		if (pBI->IsLiterature) { 
			t_span = CTimeSpan(30, 0, 0, 0);	// 文学书只借30天 
		}else{ 
			t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0); 
		} 
		pBI->shouldReTime = t_borrow + t_span; 
	} 
	else	//续借过 
	{ 
		t_reborrow = CTime(pBI->reborrowTime.GetYear(),pBI->reborrowTime.GetMonth(),pBI->reborrowTime.GetDay(),0,0,0); 
		//如果没有时间则无法计算还书时间		 
		if (pBI->reborrowTime.m_status == 2) 
		{ 
			pBI->shouldReTime = CTime(1970,12,30,0,0,0); 
			return; 
		}		 
		//CTimeSpan t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0); 
		//2005-9-25 
		CTimeSpan t_span; 
		if (pBI->IsLiterature) { 
			t_span = CTimeSpan(30, 0, 0, 0);	// 文学书只借30天 
		}else{ 
			t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0); 
		} 
		 
		pBI->shouldReTime = t_reborrow + t_span; 
	} 
	//*==============还书时间在假期中的处理=============*// 
	if (pBI->HasHoliday)//图书馆有假期 
	{ 
		CTime h_begin,h_end; 
		h_begin = CTime(pBI->holiday_begin.GetYear(),pBI->holiday_begin.GetMonth(),pBI->holiday_begin.GetDay(),0,0,0); 
		h_end   = CTime(pBI->holiday_end.GetYear(),pBI->holiday_end.GetMonth(),pBI->holiday_end.GetDay(),0,0,0); 
		//如果还书时间在假期中 
		if (pBI->shouldReTime > h_begin && pBI->shouldReTime < h_end ) 
		{ 
			CTimeSpan t_span; 
			t_span = pBI->shouldReTime - h_begin; 
			pBI->shouldReTime = h_end + t_span; 
		}//end-if(在假期) 
	}//end-if(图书馆有假期) 
	//*=================================================*// 
} 
 
/*===============================OnUserAdd============================================ 
说明: 
	添加新用户处理函数。只要一添加,就会在user表中添加相应数据,不 
	管是否保存了数据 
====================================================================================*/ 
void CPBMSDoc::OnUserAdd()  
{ 
	//*=============确保只有管理员才能进行本操作========*// 
	bool bManagerLogon = false; 
	for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++) 
	{ 
		if (m_managerID == m_LogonUserID.GetAt(i)) 
		{ 
			bManagerLogon = true; 
			break; 
		} 
		else if (m_managerID == 0) 
		{ 
			bManagerLogon = true; 
			break;		 
		} 
	} 
	if (!bManagerLogon) 
	{ 
		AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!"); 
		return; 
	} 
	//*=================================================*//	 
 
	//获取用户信息中的两个List数据 
	if (m_saKnowLevel.GetSize() == 0) 
	{ 
		//从knowledge表中读数据,结果存放在m_uaKnowLevID和m_saKnowLevel对象中, 
		m_adoRecordSet.Get_ID_Info_Array("knowledge",m_saKnowLevel,2,m_uaKnowLevID); 
		//从identities表中读数据,结果存放在m_uaIdentyID和m_saIdentity对象中, 
		m_adoRecordSet.Get_ID_Info_Array("identities",m_saIdentity,2,m_uaIdentyID);	 
	} 
	//*==============设置新添用户数据默认值=============*// 
	//ID 
	m_curUserInfo.Id = ++ UserID; 
	//姓名 
	m_curUserInfo.name.Format("用户%d",m_curUserInfo.Id); 
	//性别 
	m_curUserInfo.sex = true; 
	//年龄 
	m_curUserInfo.age = 20; 
	//文化ID 
	m_curUserInfo.knowID = 4;	//本科 
	//证件ID 
	m_curUserInfo.identID = 4;	//借书证 
	//证件号 
	m_curUserInfo.CardNumber = _T(""); 
	//住址 
	m_curUserInfo.address = _T(""); 
	//密码 
	m_curUserInfo.pass = _T(""); 
	//相片数据 
	m_curUserInfo.photo.hasPhoto = false; 
	m_curUserInfo.photo.Height = 0; 
	m_curUserInfo.photo.len = 0; 
	m_curUserInfo.photo.pdata = NULL; 
	m_curUserInfo.photo.Path = _T(""); 
	m_curUserInfo.photo.Width = 0; 
	//安全级别 
	m_curUserInfo.safelevel = 0; 
	//还书提醒 
	m_curUserInfo.IsAlert = true; 
	//提醒时间 
	m_curUserInfo.days = 3; 
	//管理员 
	m_curUserInfo.IsAdmin = false; 
	// 
	m_IsNewUser = true; 
	//*=================================================*// 
	 
	//*==============在users表中添加数据================*// 
	//构造查询语句 
	CString szSQL; 
	szSQL.Format("select * from users"); 
	//在数据集中添加一项 
	BOOL b = m_adoRecordSet.Open(szSQL); 
	b = m_adoRecordSet.AddNew(); 
	//将除相片以外的基本信息保存数据库 
	if (!m_adoRecordSet.PutCollect("ID",m_curUserInfo.Id ) 
	  ||!m_adoRecordSet.PutCollect(1,m_curUserInfo.name ) 
	  ||!m_adoRecordSet.PutCollect(2,m_curUserInfo.sex ) 
	  ||!m_adoRecordSet.PutCollect(3,m_curUserInfo.age ) 
	  ||!m_adoRecordSet.PutCollect(4,m_curUserInfo.knowID ) 
	  ||!m_adoRecordSet.PutCollect(5,m_curUserInfo.identID ) 
	  ||!m_adoRecordSet.PutCollect(6,m_curUserInfo.CardNumber )	 
	  ||!m_adoRecordSet.PutCollect(7,m_curUserInfo.address ) 
	  ||!m_adoRecordSet.PutCollect(8,m_curUserInfo.pass ) 
	  ||!m_adoRecordSet.PutCollect(10,m_curUserInfo.safelevel ) 
	  ||!m_adoRecordSet.PutCollect(11,m_curUserInfo.IsAlert ) 
	  ||!m_adoRecordSet.PutCollect(12,m_curUserInfo.days ) 
	  ||!m_adoRecordSet.PutCollect(13,m_curUserInfo.IsAdmin ) 
	  ||!m_adoRecordSet.PutCollect(14,m_curUserInfo.photo.Width ) 
	  ||!m_adoRecordSet.PutCollect(15,m_curUserInfo.photo.Height )) 
	{ 
		AfxMessageBox("29-保存新用户数据失败!"); 
		m_adoRecordSet.Close();//关闭数据集users 
		return; 
	} 
	m_adoRecordSet.Update(); 
	m_adoRecordSet.Close();//关闭数据集users 
	//*=================================================*// 
 
	//*==============在左视图中修改树控件数据项=========*// 
	//首先获取左视图指针 
	POSITION pos = GetFirstViewPosition(); 
	CView* pView; 
	while (pos) 
	{ 
		pView = GetNextView(pos); 
		if (pView->IsKindOf(RUNTIME_CLASS(CLeftView))) 
		{ 
			break; 
		} 
	} 
	CLeftView *pLeftView = (CLeftView *)pView; 
	//调用左视图对象函数修改树控件 
	pLeftView->ModifyTree(); 
	//*=================================================*// 
 
	//显示新用户面板 
	GetDataAndShow(1,false); 
} 
 
/*=========================ModifyName================================================= 
说明: 
	当在左面板修改名称后,将修改右面板相应编辑框数据 
参数: 
	IsUser	= true :	修改用户名 
			= false:	修改图书馆名 
====================================================================================*/ 
void CPBMSDoc::ModifyName(bool IsUser) 
{ 
	if (IsUser) 
	{ 
		GetDataAndShow(1,false); 
	} 
	else 
	{ 
		GetDataAndShow(4,false); 
	} 
} 
 
/*=========================OnUserDel================================================== 
说明: 
	删除用户 
====================================================================================*/ 
void CPBMSDoc::OnUserDel()  
{ 
	//*=============确保只有管理员才能进行本操作========*// 
	bool bManagerLogon = false; 
	for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++) 
	{ 
		if (m_managerID == m_LogonUserID.GetAt(i)) 
		{ 
			bManagerLogon = true; 
			break; 
		} 
		else if (m_managerID == 0) 
		{ 
			bManagerLogon = true; 
			break;		 
		} 
	} 
	if (!bManagerLogon) 
	{ 
		AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!"); 
		return; 
	} 
	//*=================================================*//	 
 
	//从users表中读数据,结果存放在m_saUsersName和m_saUsersID对象中, 
	m_saUsersName.RemoveAll(); 
	m_uaUsersID.RemoveAll(); 
	m_adoRecordSet.Get_ID_Info_Array("users",m_saUsersName,2,m_uaUsersID); 
	CUserDelDlg dlg; 
	//将用户名及ID传入对话框对象 
	dlg.m_saUsersName.Copy(m_saUsersName); 
	dlg.m_uaUsersID.Copy(m_uaUsersID); 
	CString szSQL; 
	if (dlg.DoModal() == IDOK) 
	{ 
		m_DeleteUserID = dlg.m_userID; 
		//构造SQL语句 
		szSQL.Format("select * from users \ 
					  where ID = %d", 
					  m_DeleteUserID); 
		bool	IsAdmin = false; 
		m_adoRecordSet.Open(szSQL);			//打开数据集 
		//检查是否是管理员 
		m_adoRecordSet.GetCollect(13,IsAdmin); 
		if (IsAdmin) 
		{ 
			AfxMessageBox("不能删除管理员,请在设定新的管理员\n后再删除该用户!"); 
			return; 
		} 
		m_adoRecordSet.Delete();			//删除数据 
		m_adoRecordSet.Update();			//更新数据集 
		m_adoRecordSet.Close();				//关闭数据集 
		//删除该用户书籍 
		if (dlg.m_delbooks) 
		{ 
			szSQL.Format("select * from books \ 
						  where UserID = %d", 
						  dlg.m_userID); 
			m_adoRecordSet.Open(szSQL);		//打开数据集 
			while (!m_adoRecordSet.IsEOF()) 
			{ 
				m_adoRecordSet.Delete();	//删除数据 
				m_adoRecordSet.MoveNext();	//后移 
			}//end-while 
			m_adoRecordSet.Update();		//更新数据集 
			m_adoRecordSet.Close();			//关闭数据集			 
		}//end-if(删除书籍) 
		//*==============在左视图中修改树控件数据项=========*// 
		//首先获取左视图指针 
		POSITION pos = GetFirstViewPosition(); 
		CView* pView; 
		while (pos) 
		{ 
			pView = GetNextView(pos); 
			if (pView->IsKindOf(RUNTIME_CLASS(CLeftView))) 
			{ 
				break; 
			} 
		} 
		CLeftView *pLeftView = (CLeftView *)pView; 
		//调用左视图对象函数修改树控件 
		pLeftView->ModifyTree(false);//删除 
		//*=================================================*// 
	}//end-if 
	 
} 
 
/*=========================OnLibAdd=================================================== 
说明: 
	添加图书馆 
====================================================================================*/ 
void CPBMSDoc::OnLibAdd()  
{ 
	//*=============确保只有管理员才能进行本操作========*// 
	bool bManagerLogon = false; 
	for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++) 
	{ 
		if (m_managerID == m_LogonUserID.GetAt(i)) 
		{ 
			bManagerLogon = true; 
			break; 
		} 
		else if (m_managerID == 0) 
		{ 
			bManagerLogon = true; 
			break;		 
		} 
	} 
	if (!bManagerLogon) 
	{ 
		AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!"); 
		return; 
	} 
	//*=================================================*//	 
 
	//*==============设置新添图书馆数据默认值===========*// 
	//ID 
	m_curLibInfo.id = ++ LibID; 
	//馆名 
	m_curLibInfo.name.Format("图书馆%d",m_curLibInfo.id ); 
	//允许借书时间 
	m_curLibInfo.canborrowTime = 1; 
	//允许续借时间 
	m_curLibInfo.canreborrowTime = 2; 
	//续借次数 
	m_curLibInfo.canreborrowCount = 2; 
	//最大借书数目 
	m_curLibInfo.maxbookCount = 15; 
	//有假期否 
	m_curLibInfo.HasHoliday = false; 
	m_curLibInfo.holiday_begin.SetStatus(COleDateTime::null); 
	m_curLibInfo.holiday_end.SetStatus(COleDateTime::null);	 
	//*=================================================*// 
	 
	//*==============在users表中添加数据================*// 
	//构造查询语句 
	CString szSQL; 
	szSQL.Format("select * from lib"); 
	//在数据集中添加一项 
	BOOL b = m_adoRecordSet.Open(szSQL); 
	b = m_adoRecordSet.AddNew(); 
	if (!m_adoRecordSet.PutCollect("ID",m_curLibInfo.id ) 
		||!m_adoRecordSet.PutCollect(1,m_curLibInfo.name ) 
		||!m_adoRecordSet.PutCollect(2,m_curLibInfo.canborrowTime ) 
		||!m_adoRecordSet.PutCollect(3,m_curLibInfo.canreborrowTime ) 
		||!m_adoRecordSet.PutCollect(4,m_curLibInfo.canreborrowCount ) 
		||!m_adoRecordSet.PutCollect(5,m_curLibInfo.maxbookCount ) 
		||!m_adoRecordSet.PutCollect(6,m_curLibInfo.HasHoliday )) 
	{ 
		AfxMessageBox("30-保存图书馆信息失败!"); 
		m_adoRecordSet.Close();//关闭数据集 
		return; 
	}//end-if 
	//***======对假期时间单独保存======***// 
	if (m_curLibInfo.holiday_begin.m_status != 2) 
	{ 
		m_adoRecordSet.PutCollect(7,m_curLibInfo.holiday_begin); 
	} 
	if (m_curLibInfo.holiday_end.m_status != 2) 
	{ 
		m_adoRecordSet.PutCollect(8,m_curLibInfo.holiday_end); 
	} 
	//***==============================***// 
	m_adoRecordSet.Update(); 
	m_adoRecordSet.Close();//关闭数据集users 
	//*=================================================*// 
 
	//*==============在左视图中修改树控件数据项=========*// 
	//首先获取左视图指针 
	POSITION pos = GetFirstViewPosition(); 
	CView* pView; 
	while (pos) 
	{ 
		pView = GetNextView(pos); 
		if (pView->IsKindOf(RUNTIME_CLASS(CLeftView))) 
		{ 
			break; 
		} 
	} 
	CLeftView *pLeftView = (CLeftView *)pView; 
	//调用左视图对象函数修改树控件 
	pLeftView->ModifyTree(true,false); 
	//*=================================================*// 
	//显示新用户面板 
	GetDataAndShow(4,false); 
} 
 
/*=========================OnLibDel=================================================== 
说明: 
	删除图书馆 
====================================================================================*/ 
void CPBMSDoc::OnLibDel()  
{ 
	//*=============确保只有管理员才能进行本操作========*// 
	bool bManagerLogon = false; 
	for (int i = 0 ;i < m_LogonUserID.GetSize(); i ++) 
	{ 
		if (m_managerID == m_LogonUserID.GetAt(i)) 
		{ 
			bManagerLogon = true; 
			break; 
		} 
		else if (m_managerID == 0) 
		{ 
			bManagerLogon = true; 
			break;		 
		} 
	} 
	if (!bManagerLogon) 
	{ 
		AfxMessageBox("只有管理员才能进行此操作,\n请确保管理员已经登录,\n详情请参考帮助文件!"); 
		return; 
	} 
	//*=================================================*//	 
 
	//从lib表中读数据,结果存放在m_saLibsName和m_saLibsID对象中, 
	m_saLibsName.RemoveAll(); 
	m_uaLibsID.RemoveAll(); 
	m_adoRecordSet.Get_ID_Info_Array("lib",m_saLibsName,2,m_uaLibsID); 
	CLibDelDlg dlg; 
	//将用户名及ID传入对话框对象 
	dlg.m_saLibsName.Copy(m_saLibsName); 
	dlg.m_uaLibsID.Copy(m_uaLibsID); 
	CString szSQL; 
	if (dlg.DoModal() == IDOK) 
	{ 
		m_DeleteLibID = dlg.m_libID; 
		//构造SQL语句 
		szSQL.Format("select * from lib \ 
					  where ID = %d", 
					  m_DeleteLibID); 
		m_adoRecordSet.Open(szSQL);			//打开数据集 
		m_adoRecordSet.Delete();			//删除数据 
		m_adoRecordSet.Update();			//更新数据集 
		m_adoRecordSet.Close();				//关闭数据集 
		//删除该图书馆书籍 
		if (dlg.m_delbooks) 
		{ 
			szSQL.Format("select * from books \ 
						  where LibID = %d", 
						  dlg.m_libID); 
			m_adoRecordSet.Open(szSQL);		//打开数据集 
			while (!m_adoRecordSet.IsEOF()) 
			{ 
				m_adoRecordSet.Delete();	//删除数据 
				m_adoRecordSet.MoveNext();	//后移 
			}//end-while 
			m_adoRecordSet.Update();		//更新数据集 
			m_adoRecordSet.Close();			//关闭数据集			 
		}//end-if(删除书籍) 
		//*==============在左视图中修改树控件数据项=========*// 
		//首先获取左视图指针 
		POSITION pos = GetFirstViewPosition(); 
		CView* pView; 
		while (pos) 
		{ 
			pView = GetNextView(pos); 
			if (pView->IsKindOf(RUNTIME_CLASS(CLeftView))) 
			{ 
				break; 
			} 
		} 
		CLeftView *pLeftView = (CLeftView *)pView; 
		//调用左视图对象函数修改树控件 
		pLeftView->ModifyTree(false,false);//删除图书馆 
		//*=================================================*// 
	}//end-if 
		 
} 
 
/*=========================SafeGate=================================================== 
说明: 
	安全关口。用户登录 
====================================================================================*/ 
BOOL CPBMSDoc::SafeGate() 
{ 
	int			m_LogonCount = 0;	//当前用户尝试登录次数,不能超过3次	 
	CLogonDlg	dlg; 
	while(m_LogonCount != 3)	//3次输入密码机会 
	{ 
		if (dlg.DoModal() == IDOK) 
		{ 
			if (dlg.m_szPass == m_curUserInfo.pass)//密码相符 
			{ 
				m_LogonUserID.Add(m_curUserInfo.Id);//将该用户ID记录下来 
				return TRUE; 
			} 
			else 
			{ 
				AfxMessageBox("您输入的密码不对"); 
				m_LogonCount ++; 
			}//end-else 
		}//end-if(DoModal) 
		else 
		{ 
			break; 
		} 
	}//end-while 
	return FALSE; 
} 
 
/*=========================OnSysChangeadmin=========================================== 
说明: 
	修改系统管理员处理函数 
====================================================================================*/ 
void CPBMSDoc::OnSysChangeadmin()  
{ 
	CAdminLogonDlg	dlg; 
	CSelectAdminDlg dlg2; 
	int				logonCount = 0; 
 	CString			szSQL; 
	//*==============初始化修改管理员对话框=============*// 
	//从users表中读数据,结果存放在m_saUsersName和m_saUsersID对象中, 
	m_saUsersName.RemoveAll(); 
	m_uaUsersID.RemoveAll(); 
	m_adoRecordSet.Get_ID_Info_Array("users",m_saUsersName,2,m_uaUsersID); 
	//*=================================================*// 
	//当前没有管理员 
	if (m_managerID == 0) 
	{ 
		dlg2.m_saUsersName.Copy(m_saUsersName); 
		dlg2.m_uaUsersID.Copy(m_uaUsersID);		 
		if (dlg2.DoModal() == IDOK) 
		{ 
			//如果设置为没有管理员,则退出(因为当前本来就没有管理员) 
			if (dlg2.m_noadmin) 
			{ 
				return; 
			} 
			//将新管理员的IsAdmin位在数据库中设置 
			szSQL.Format("select * from users \ 
						  where ID = %d", 
						  dlg2.m_userID); 
			m_adoRecordSet.Open(szSQL); 
			m_adoRecordSet.PutCollect("是否管理员",true); 
			//将全局管理员变量值重新设置 
			m_managerID = dlg2.m_userID; 
			m_adoRecordSet.GetCollect("密码",m_managerPass); 
			//更新数据库 
			m_adoRecordSet.Update(); 
			m_adoRecordSet.Close(); 
		}//end-if(dlg2.DoModal()) 
		else 
		{ 
			return; 
		}//end-else		 
	}//end-if 
	else//有管理员 
	{	 
		while (logonCount != 3) 
		{ 
			if (dlg.DoModal() == IDOK) 
			{ 
				if (dlg.m_pass == m_managerPass) 
				{ 
					//显示选择管理员对话框 
					//将用户名及ID传入对话框对象 
					dlg2.m_saUsersName.Copy(m_saUsersName); 
					dlg2.m_uaUsersID.Copy(m_uaUsersID); 
					if (dlg2.DoModal() == IDOK) 
					{ 
						//首先将原来管理员的IsAdmin位在数据库中清除 
						szSQL.Format("select * from users \ 
									  where ID = %d", 
									  m_managerID); 
						BOOL b = m_adoRecordSet.Open(szSQL); 
						b = m_adoRecordSet.PutCollect("是否管理员",false); 
						b = m_adoRecordSet.Update(); 
						m_adoRecordSet.Close(); 
						//将新管理员的IsAdmin位在数据库中设置 
						if (!dlg2.m_noadmin) 
						{ 
							szSQL.Format("select * from users \ 
										  where ID = %d", 
										  dlg2.m_userID); 
							m_adoRecordSet.Open(szSQL); 
							m_adoRecordSet.PutCollect("是否管理员",true); 
							//将全局管理员变量值重新设置 
							m_managerID = dlg2.m_userID; 
							m_adoRecordSet.GetCollect("密码",m_managerPass); 
							//更新数据库 
							m_adoRecordSet.Update(); 
							m_adoRecordSet.Close(); 
						} 
						break; 
					}//end-if 
					else 
					{ 
						break; 
					}//end-else 
				}//end-if(dlg.m_pass == m_managerPass) 
				else 
				{ 
					AfxMessageBox("您输入的密码不对,\n请找管理员联系!"); 
					logonCount ++; 
				}//end-if 
			}//end-if(dlg.DoModal() == IDOK) 
			else 
			{ 
				break; 
			} 
		}//end-while 
	}//end-else 
} 
 
/*=========================OnSysLogonout============================================== 
说明: 
	用户注销函数 
====================================================================================*/ 
void CPBMSDoc::OnSysLogonout()  
{ 
	CLogonOutDlg dlg; 
	//将用户名、ID及登录用户ID传入对话框对象 
	dlg.m_saUsersName.Copy(m_saUsersName); 
	dlg.m_uaUsersID.Copy(m_uaUsersID); 
	dlg.m_LogonUserID.Copy(m_LogonUserID); 
	//显示对话框 
	if (dlg.DoModal() == IDOK) 
	{ 
		//将用户从已经登录用户列表中删除 
		for(int i = 0; i < m_LogonUserID.GetSize(); i ++) 
		{ 
			if (m_LogonUserID.GetAt(i) == dlg.m_userID) 
			{ 
				m_LogonUserID.RemoveAt(i); 
				//*==============显示主面板=========================*// 
				 
				//***======获取左面板对象==========***// 
				POSITION pos = GetFirstViewPosition(); 
				CView* pView; 
				while (pos) 
				{ 
					pView = GetNextView(pos); 
					if (pView->IsKindOf(RUNTIME_CLASS(CLeftView))) 
					{ 
						break; 
					}	 
				} 
				CLeftView *pLeftView = (CLeftView *)pView; 
				//***==============================***// 
				//调用左面板对象函数显示主板 
				pLeftView->SelectRoot(); 
				//*=================================================*//				 
				break; 
			}//end-if 
		}//end-for 
	}//end-if(DoModal) 
} 
 
/*=============================ScanBooks============================================== 
说明: 
	用来扫描快到期书籍。 
参数: 
	noAlert = true	: 如果没有图书超期,也要报告 
			= false : 如果没有图书超期,不报告 
====================================================================================*/ 
void CPBMSDoc::ScanBooks(bool noAlert) 
{ 
	//*==============从数据库中读取数据=================*// 
	CString szSQL; 
	szSQL.Format("select * from ShouldReturnBooks \ 
				  order by users.ID");//按用户ID排序	 
	BOOL b = m_adoRecordSet.Open(szSQL); 
	//*=================================================*// 
	CArray m_ShouldReturnBooks;	//所有需报警之图书 
	BOOKINFOEX	bookinfo; 
	while (!m_adoRecordSet.IsEOF()) 
	{ 
		if (!m_adoRecordSet.GetCollect("users.ID",bookinfo.userID ) 
			||!m_adoRecordSet.GetCollect(1,bookinfo.userName ) 
			||!m_adoRecordSet.GetCollect(2,bookinfo.bookID ) 
			||!m_adoRecordSet.GetCollect(3,bookinfo.borrowTime ) 
			||!m_adoRecordSet.GetCollect(4,bookinfo.reborrowTime ) 
			||!m_adoRecordSet.GetCollect(5,bookinfo.canborrowTime ) 
			||!m_adoRecordSet.GetCollect(6,bookinfo.canreborrowTime ) 
			||!m_adoRecordSet.GetCollect(7,bookinfo.HasHoliday ) 
			||!m_adoRecordSet.GetCollect(8,bookinfo.holiday_begin ) 
			||!m_adoRecordSet.GetCollect(9,bookinfo.holiday_end ) 
			||!m_adoRecordSet.GetCollect(10,bookinfo.alertTime ) 
			||!m_adoRecordSet.GetCollect(11,bookinfo.reborrowCount ) 
			||!m_adoRecordSet.GetCollect(12,bookinfo.IsLiterature )) 
		{ 
			AfxMessageBox("!-读取书籍信息失败!"); 
			m_adoRecordSet.Close();	//关闭数据集 
			return; 
		}//end-if 
		//获取还书时间 
		GetReturnTime(&bookinfo); 
		//计算离到期时间 
		CTime today = CTime::GetCurrentTime(); 
		CTimeSpan t_span = bookinfo.shouldReTime - today; 
		//与用户设置的报警时间进行比较 
		if (t_span.GetDays() <= bookinfo.alertTime) 
		{ 
			m_ShouldReturnBooks.Add(bookinfo); 
		} 
		m_adoRecordSet.MoveNext();	//后移 
	}//end-while 
	m_adoRecordSet.Close();			//关闭数据集 
	//*==============报警===============================*// 
	//将到期图书按用户分类 
	CStringArray	m_saUserName;	//有到期图书用户名 
	CUIntArray		m_uaBookCount;	//相应的到期图书数目 
	//中间变量 
	int				index = -1;			 
	int				count = 0; 
	for(int i = 0; i < m_ShouldReturnBooks.GetSize(); i ++) 
	{ 
		if (index == -1)	//用户名数组为空 
		{ 
			m_saUserName.Add(m_ShouldReturnBooks.GetAt(i).userName); 
			count ++; 
			index ++; 
		}//end-if(index) 
		else				//用户名数组不为空 
		{ 
			if (m_ShouldReturnBooks.GetAt(i).userName == m_saUserName.GetAt(index)) 
			{ 
				count ++; 
			}//end-if 
			else	//另一用户 
			{ 
				m_uaBookCount.Add(count); 
				m_saUserName.Add(m_ShouldReturnBooks.GetAt(i).userName); 
				index ++; 
				count = 1; 
			}//end-else 
		}//end-else 
	}//end-for 
	//将最后一个用户的书本数目添加到数组中 
	if (count != 0) 
	{ 
		m_uaBookCount.Add(count); 
	} 
	//弹出警告框 
	CAlertDlg	dlg; 
	//没有超人期图书 
	if (m_saUserName.GetSize() == 0) 
	{ 
		if (noAlert == false) 
		{ 
			return; 
		} 
		dlg.m_saAlert = "没有超期图书"; 
		dlg.DoModal(); 
		return; 
	} 
	else 
	{ 
		//有超期图书 
		dlg.m_saAlert = ""; 
		CString s; 
		for (i = 0; i < m_saUserName.GetSize(); i ++) 
		{ 
			//信息 
			s.Format("\t%d 本书快到期\n\n",m_uaBookCount.GetAt(i)); 
			dlg.m_saAlert += "用户:"; 
			dlg.m_saAlert += m_saUserName.GetAt(i); 
			dlg.m_saAlert += s; 
		} 
		//发出报警声 
		::sndPlaySound(CPBMSDoc::AlertSoundPath,SND_ASYNC); 
		//显示警告框 
		dlg.DoModal(); 
	} 
	//*=================================================*//	 
} 
 
/*=========================GetReturnTime============================================== 
说明: 
	获取还书时间,日后图书馆制度变更后,程序修改只需在此模块进行 
参数: 
	pBI:书籍的所有信息,返回值也在其中的shouldReTime字段中 
====================================================================================*/ 
void CPBMSDoc::GetReturnTime(PBOOKINFOEX pBI) 
{ 
	//中间变量 
	CTime t_borrow,t_reborrow; 
	t_borrow = CTime(pBI->borrowTime.GetYear(),pBI->borrowTime.GetMonth(),pBI->borrowTime.GetDay(),0,0,0); 
	// 
	if (pBI->reborrowCount == 0)//没有续借过 
	{ 
		//如果没有时间则无法计算还书时间 
		if (pBI->borrowTime.m_status == 2) 
		{ 
			pBI->shouldReTime = CTime(1970,12,30,0,0,0); 
			return; 
		} 
//		CTimeSpan t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0); 
		CTimeSpan t_span; 
		if (pBI->IsLiterature) { 
			t_span = CTimeSpan(30, 0, 0, 0);	// 文学书只借30天 
		}else{ 
			t_span = CTimeSpan(30 * pBI->canborrowTime,0,0,0); 
		} 
 
		pBI->shouldReTime = t_borrow + t_span; 
	} 
	else	//续借过 
	{ 
		t_reborrow = CTime(pBI->reborrowTime.GetYear(),pBI->reborrowTime.GetMonth(),pBI->reborrowTime.GetDay(),0,0,0); 
		//如果没有时间则无法计算还书时间		 
		if (pBI->reborrowTime.m_status == 2) 
		{ 
			pBI->shouldReTime = CTime(1970,12,30,0,0,0); 
			return; 
		}		 
		//CTimeSpan t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0); 
		//2005-9-25 
		CTimeSpan t_span; 
		if (pBI->IsLiterature) { 
			t_span = CTimeSpan(30, 0, 0, 0);	// 文学书只借30天 
		}else{ 
			t_span = CTimeSpan(30 * pBI->canreborrowTime,0,0,0); 
		} 
		pBI->shouldReTime = t_reborrow + t_span; 
	} 
	//*==============还书时间在假期中的处理=============*// 
	if (pBI->HasHoliday)//图书馆有假期 
	{ 
		CTime h_begin,h_end; 
		h_begin = CTime(pBI->holiday_begin.GetYear(),pBI->holiday_begin.GetMonth(),pBI->holiday_begin.GetDay(),0,0,0); 
		h_end   = CTime(pBI->holiday_end.GetYear(),pBI->holiday_end.GetMonth(),pBI->holiday_end.GetDay(),0,0,0); 
		//如果还书时间在假期中 
		if (pBI->shouldReTime > h_begin && pBI->shouldReTime < h_end ) 
		{ 
			CTimeSpan t_span; 
			t_span = pBI->shouldReTime - h_begin; 
			pBI->shouldReTime = h_end + t_span; 
		}//end-if(在假期) 
	}//end-if(图书馆有假期) 
	//*=================================================*// 
} 
 
/*=========================OnScanbooks================================================ 
说明: 
	用户在程序运行期间,进行到期图书检查操作处理函数 
====================================================================================*/ 
void CPBMSDoc::OnScanbooks()  
{ 
	ScanBooks(); 
} 
 
/*=========================GetSoundPath=============================================== 
说明: 
	之所以要在Doc中的初始化函数处调用此函数是因为本来在SysDlg对象中 
	实现的功能在初始化时还未实现,故不能获得声音路径,导致初始化 
	时不能发出声音 
====================================================================================*/ 
void CPBMSDoc::GetSoundPath() 
{ 
	char filepath[128]; 
	//获取路径 
	::GetCurrentDirectory(sizeof(filepath),filepath); 
	int i=0; 
	while(filepath[i] != '\0') 
	{ 
		i ++ ; 
	} 
	filepath[i] = '\\'; 
	char *filename = "Config.inf"; 
	while ( *filename != '\0') 
	{ 
		filepath[++i] = *filename; 
		filename ++; 
	} 
	filepath[++i] = '\0';		//添加字符串结束符 
	//---============---// 
	//打开文件,读取数据 
	CStdioFile file; 
	if (!file.Open(filepath,CFile::modeRead | CFile::typeText ))	 
	{ 
		CPBMSDoc::AlertSoundPath = "sound\\msg.wav"; 
	} 
	else 
	{ 
		try 
		{ 
			file.ReadString(CPBMSDoc::AlertSoundPath); 
			file.Close(); 
		}//end-try 
		catch(CFileException * e) 
		{ 
			file.Close(); 
			//如果打开配置文件失败,则自行设置参数,保证程序的正常运行 
			CPBMSDoc::AlertSoundPath = "sound\\msg.wav"; 
		} 
	}//end-else; 
}