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

📄 managerview.cpp

📁 VC6数据库开发指南
💻 CPP
📖 第 1 页 / 共 3 页
字号:

//将OLE数据转换为C++数据
CString CManagerView::VariantToStr(const COleVariant& var)
{
	CString strRet;
	strRet = _T("Fish");
	switch(var.vt){
		case VT_EMPTY:
		case VT_NULL:
			strRet = _T("NULL");
			break;
		case VT_I2:
			strRet.Format(_T("%hd"),V_I2(&var));
			break;
		case VT_I4:
			strRet.Format(_T("%d"),V_I4(&var));
			break;
		case VT_R4:
			strRet.Format(_T("%e"),(double)V_R4(&var));
			break;
		case VT_R8:
			strRet.Format(_T("%e"),V_R8(&var));
			break;
		case VT_CY:
			strRet = COleCurrency(var).Format();
			break;
		case VT_DATE:
			strRet = COleDateTime(var).Format(_T("%m %d %y"));
			break;
		case VT_BSTR:
			strRet = V_BSTRT(&var);
			break;
		case VT_DISPATCH:
			strRet = _T("VT_DISPATCH");
			break;
		case VT_ERROR:
			strRet = _T("VT_ERROR");
			break;
		case VT_BOOL:
			return V_BOOL(&var) ? _T("TRUE") : _T("FALSE");
		case VT_VARIANT:
			strRet = _T("VT_VARIANT");
			break;
		case VT_UNKNOWN:
			strRet = _T("VT_UNKNOWN");
			break;
		case VT_I1:
			strRet = _T("VT_I1");
			break;
		case VT_UI1:
			strRet.Format(_T("0x%02hX"),(unsigned short)V_UI1(&var));
			break;
		case VT_UI2:
			strRet = _T("VT_UI2");
			break;
		case VT_UI4:
			strRet = _T("VT_UI4");
			break;
		case VT_I8:
			strRet = _T("VT_I8");
			break;
		case VT_UI8:
			strRet = _T("VT_UI8");
			break;
		case VT_INT:
			strRet = _T("VT_INT");
			break;
		case VT_UINT:
			strRet = _T("VT_UINT");
			break;
		case VT_VOID:
			strRet = _T("VT_VOID");
			break;
		case VT_HRESULT:
			strRet = _T("VT_HRESULT");
			break;
		case VT_PTR:
			strRet = _T("VT_PTR");
			break;
		case VT_SAFEARRAY:
			strRet = _T("VT_SAFEARRAY");
			break;
		case VT_CARRAY:
			strRet = _T("VT_CARRAY");
			break;
		case VT_USERDEFINED:
			strRet = _T("VT_USERDEFINED");
			break;
		case VT_LPSTR:
			strRet = _T("VT_LPSTR");
			break;
		case VT_LPWSTR:
			strRet = _T("VT_LPWSTR");
			break;
		case VT_FILETIME:
			strRet = _T("VT_FILETIME");
			break;
		case VT_BLOB:
			strRet = _T("VT_BLOB");
			break;
		case VT_STREAM:
			strRet = _T("VT_STREAM");
			break;
		case VT_STORAGE:
			strRet = _T("VT_STORAGE");
			break;
		case VT_STREAMED_OBJECT:
			strRet = _T("VT_STREAMED_OBJECT");
			break;
		case VT_STORED_OBJECT:
			strRet = _T("VT_STORED_OBJECT");
			break;
		case VT_BLOB_OBJECT:
			strRet = _T("VT_BLOB_OBJECT");
			break;
		case VT_CF:
			strRet = _T("VT_CF");
			break;
		case VT_CLSID:
			strRet = _T("VT_CLSID");
			break;
	}
	return strRet;
}

//处理添加记录工具栏按钮命令
void CManagerView::OnAdd() 
{
	// TODO: Add your control notification handler code here
	if(m_bIsAddress)//根据当前数据库表选择添加函数
		AddAddress();
	else if(m_bIsMoney)
		AddMoney();
}

//处理修改记录工具栏按钮命令
void CManagerView::OnModify() 
{
	// TODO: Add your control notification handler code here
	if(m_bIsAddress)//根据当前数据库表选择修改函数
		ModifyAddress();
	else if(m_bIsMoney)
		ModifyMoney();
}

//处理删除记录工具栏按钮命令
void CManagerView::OnDel() 
{
	// TODO: Add your control notification handler code here
	if(m_bIsAddress)//根据当前数据库表选择修改函数
		DelAddress();
	if(m_bIsMoney)
		DelMoney();
}

//修改通讯录记录
void CManagerView::ModifyAddress()
{
	
    //创建通讯录记录设置对话框对象,由于没有为该对话框类添加OnInitiate()函数,因此
	//必须用这种方式创建对话框
	CAddrSetup* dlg;
	int nItemIndex = -1;//列表框中被选行的索引
	BOOL bFieldsHaveChanged = FALSE;//记录是否被改变


	// 如果选择了列表框中的某一行
	if((m_list.GetNextItem(-1,LVNI_SELECTED))!=-1)
	{
		try {
			//打开记录集
			if(!m_addrSet.IsOpen())
				m_addrSet.Open();
			//循环,直到找到列表框中被选项为止
			while((nItemIndex = m_list.GetNextItem(nItemIndex,LVNI_SELECTED))!=-1)
			{
				CString sqlSelect=
					CString("[姓名]=")+
					CString("'")+
					CString(m_list.GetItemText(nItemIndex,0))+ 
				    CString("'");//设置查询条件
				//根据查询条件在记录集中定位记录
				if(m_addrSet.FindFirst(sqlSelect)) 
				{ 
					dlg=new CAddrSetup;//显示对话框
					//首先将记录数据赋予对话框
					dlg->m_name=m_addrSet.m_name;
					dlg->m_email=m_addrSet.m_email;
					dlg->m_hometel=m_addrSet.m_hometel;
					dlg->m_worktel=m_addrSet.m_worktel;
					dlg->m_strSex=m_addrSet.m_sex;
					dlg->m_birthday=m_addrSet.m_birthday;
					dlg->m_bp=m_addrSet.m_bp;
					if(dlg->DoModal()==IDOK)//如果单击对话框的OK按钮
					{
						m_addrSet.Edit(); // 表示开始编辑记录集
						//将对话框数据赋予记录集中的记录
						m_addrSet.m_name=dlg->m_name;
						m_addrSet.m_email=dlg->m_email;
						m_addrSet.m_bp=dlg->m_bp;
						m_addrSet.m_birthday=dlg->m_birthday;
						m_addrSet.m_sex=dlg->m_strSex;
						m_addrSet.m_hometel=dlg->m_hometel;
						m_addrSet.m_worktel=dlg->m_worktel;
						m_addrSet.Update(); // 保存修改结果
						bFieldsHaveChanged = TRUE; // 记录已经被修改
					}
					delete dlg; // 删除对话框对象
				}
				else
				{
					AfxMessageBox("内部错误\n\n在数据库中造不到所选记录\n或数据库被损坏", MB_ICONSTOP );
				}
			}
			m_addrSet.Close(); // 关闭记录集
		}
		catch(CDaoException* e)
		{ 
			char szBuffer[256];
			CString strExceptDesc=
				CString("数据库引擎错误:\n\n Error Code:")+
				CString(ltoa(e->m_pErrorInfo->m_lErrorCode,szBuffer,10))+
				CString("\nDescription:")+
				CString(e->m_pErrorInfo->m_strDescription);
			AfxMessageBox(strExceptDesc,MB_ICONEXCLAMATION);
			m_addrSet.Close();
			return;
		}
		if ( bFieldsHaveChanged )
		{
			LoadDatabaseData(); // 如果记录被更改则更新列表框中数据
		}
	}
	else 
	{ 
		AfxMessageBox("没有选择记录", MB_ICONEXCLAMATION);
	}
}

//向通讯录中添加记录
void CManagerView::AddAddress()
{
    //创建通讯录记录设置对话框对象,由于没有为该对话框类添加OnInitiate()函数,因此
	//必须用这种方式创建对话框
	CAddrSetup* dlg;
	dlg=new CAddrSetup;
	BOOL bFieldsHaveChanged = FALSE;//标识记录是否被改变

	try 
	{
    	//打开通讯录的记录集
		if(!m_addrSet.IsOpen())
			m_addrSet.Open();
		if(dlg->DoModal()==IDOK)//如果单击对话框的OK按钮
		{
			m_addrSet.AddNew(); // 表示开始对记录进行编辑
			//将对话框中的值赋予记录集中字段变量
			m_addrSet.m_name=dlg->m_name;
			m_addrSet.m_email=dlg->m_email;
			m_addrSet.m_bp=dlg->m_bp;
			m_addrSet.m_birthday=dlg->m_birthday;
			m_addrSet.m_sex=dlg->m_strSex;
			m_addrSet.m_hometel=dlg->m_hometel;
			m_addrSet.m_worktel=dlg->m_worktel;
			m_addrSet.Update(); // 保存编辑结果
			bFieldsHaveChanged = TRUE; // 记录被改变
		}
		delete dlg; // 删除对话框对象
	}
		
	catch(CDaoException* e)
	{ 
		char szBuffer[256];
		CString strExceptDesc=
			CString("数据库引擎错误:\n\n 错误码:")+
			CString(ltoa(e->m_pErrorInfo->m_lErrorCode,szBuffer,10))+
			CString("\n描述:")+
	    	CString(e->m_pErrorInfo->m_strDescription);
		AfxMessageBox(strExceptDesc,MB_ICONEXCLAMATION);
		m_addrSet.Close();
		return;
	}

	if ( bFieldsHaveChanged )
	{
		LoadDatabaseData(); // 如果记录被改变,则更新列表框显示
	}
}

//删除通讯录中的记录
void CManagerView::DelAddress()
{
	BOOL bFieldsHaveChanged=FALSE;//表示数据库表记录是否被改变
	int nItemIndex=-1;//当前所选记录的索引

	if((m_list.GetNextItem(-1,LVNI_SELECTED))!=-1)
	{
		try {
			//打开记录集
			if(!m_addrSet.IsOpen())
				m_addrSet.Open();
			while((nItemIndex = m_list.GetNextItem(nItemIndex,LVNI_SELECTED))!=-1)
			{
				CString sqlSelect=
					CString("[姓名]=")+
					CString("'")+
					CString(m_list.GetItemText(nItemIndex,0))+ 
				    CString("'");//设置查询条件
				if(m_addrSet.FindFirst(sqlSelect))//根据查询条件定位记录 
				{ 
					//删除所选记录
					m_addrSet.Delete();
					bFieldsHaveChanged=TRUE;
				}
				else
				{
					AfxMessageBox("内部错误\n\n数据库中不存在该记录\n或者数据库被损坏", MB_ICONSTOP );
				}
			}
			m_addrSet.Close(); // 关闭记录集
		}
		catch(CDaoException* e)
		{ 
			char szBuffer[256];
			CString strExceptDesc=
				CString("数据库引擎数据:\n\n Error Code:")+
				CString(ltoa(e->m_pErrorInfo->m_lErrorCode,szBuffer,10))+
				CString("\nDescription:")+
				CString(e->m_pErrorInfo->m_strDescription);
			AfxMessageBox(strExceptDesc,MB_ICONEXCLAMATION);
			m_addrSet.Close();
			return;
		}
		if ( bFieldsHaveChanged )
		{
			LoadDatabaseData(); // 如果记录被改变则更新列表框数据
		}
	}
	else 
	{ 
		AfxMessageBox("没有选择记录", MB_ICONEXCLAMATION);
	}
}

//处理单击列表框列头消息
void CManagerView::OnColumnclickAddressList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	//根据所单击的列确定排序字段
	switch ( pNMListView -> iSubItem ) 
	{
		case 0:
			if(m_bIsAddress)
				Sort(CString("[姓名]"));
			else if(m_bIsMoney)
				Sort(CString("[日期]"));
			break;
		case 1:
			if(m_bIsAddress)
				Sort(CString("[E-Mail地址]"));
			else if(m_bIsMoney)
				Sort(CString("[总收入]"));
			break;
		case 2:
			if(m_bIsAddress)
				Sort(CString("[住宅电话]"));
			else if(m_bIsMoney)
				Sort(CString("[总支出]"));
			break;
		case 3:
			if(m_bIsAddress)
				Sort(CString("[办公电话]" ));
			else if(m_bIsMoney)
				Sort(CString("[合计]"));
			break;
		case 4:
			Sort(CString("[性别]"));
			break;
		case 5:
			Sort(CString("[生日]"));
			break;
		case 6:
			Sort(CString("[BP机号码]"));
			break;
		default:
			Sort(CString("")); // default: no sort.
			break;
	}

	*pResult = 0;
}

// 对数据库进行排序
void CManagerView::Sort(CString& str)
{
	// 清空列表框
	m_list.DeleteAllItems();

	// 设置排序参数
	if(m_bIsAddress)
		m_addrSet.m_strSort=str; 

⌨️ 快捷键说明

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