www.gusucode.com > 一个VC++课程管理程序,MSSQL数据库-源码程序 > 一个VC++课程管理程序,MSSQL数据库-源码程序\code\SourceCode\DialogTEA.cpp

    //Download by http://www.NewXing.com
// DialogTEA.cpp : implementation file
//

#include "stdafx.h"
#include "YDMS.h"
#include "DialogTEA.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDialogTEA dialog


CDialogTEA::CDialogTEA(CWnd* pParent /*=NULL*/)
	: CDialog(CDialogTEA::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDialogTEA)
	m_TeaID = 0;
	m_TeaName = _T("");
	m_TeaWay = _T("");
	m_TeaSex = _T("");
	m_TeaStatus = _T("");
	//}}AFX_DATA_INIT
}


void CDialogTEA::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDialogTEA)
	DDX_Control(pDX, IDC_EDIT_TEAID, m_ctlTeaID);
	DDX_Control(pDX, IDC_BUTTON_QUERY, m_btnQuery);
	DDX_Control(pDX, IDC_BUTTON_PRE, m_btnPre);
	DDX_Control(pDX, IDC_BUTTON_OK, m_btnOK);
	DDX_Control(pDX, IDC_BUTTON_NEXT, m_btnNext);
	DDX_Control(pDX, IDC_BUTTON_MODIFY, m_btnModify);
	DDX_Control(pDX, IDC_BUTTON_LAST, m_btnLast);
	DDX_Control(pDX, IDC_BUTTON_FIRST, m_btnFirst);
	DDX_Control(pDX, IDC_BUTTON_DELETE, m_btnDelete);
	DDX_Control(pDX, IDC_BUTTON_ADD, m_btnAdd);
	DDX_Text(pDX, IDC_EDIT_TEAID, m_TeaID);
	DDV_MinMaxInt(pDX, m_TeaID, 0, 10000);
	DDX_Text(pDX, IDC_EDIT_TEANAME, m_TeaName);
	DDV_MaxChars(pDX, m_TeaName, 10);
	DDX_Text(pDX, IDC_EDIT_TEAWAY, m_TeaWay);
	DDV_MaxChars(pDX, m_TeaWay, 50);
	DDX_CBString(pDX, IDC_COMBO_TEASEX, m_TeaSex);
	DDX_Text(pDX, IDC_EDIT_TEASTATUS, m_TeaStatus);
	DDV_MaxChars(pDX, m_TeaStatus, 20);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDialogTEA, CDialog)
	//{{AFX_MSG_MAP(CDialogTEA)
	ON_BN_CLICKED(IDC_BUTTON_QUERY, OnButtonQuery)
	ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
	ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
	ON_BN_CLICKED(IDC_BUTTON_MODIFY, OnButtonModify)
	ON_BN_CLICKED(IDC_BUTTON_FIRST, OnButtonFirst)
	ON_BN_CLICKED(IDC_BUTTON_PRE, OnButtonPre)
	ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)
	ON_BN_CLICKED(IDC_BUTTON_LAST, OnButtonLast)
	ON_BN_CLICKED(IDC_BUTTON_CANCEL, OnButtonCancel)
	ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOK)
	ON_BN_CLICKED(IDC_BUTTON_GOBACK, OnButtonGoBack)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDialogTEA message handlers
//
//添加枚举变量来实现对不同功能的区分
//
enum examTEA
{
	INIT,		//对应没有功能
	SEARCH,		//对应查找功能
	ADD,		//对应添加功能
	DEL,		//对应删除功能
	MODIFY,		//对应修改功能
};

//定义枚举变量FOUNCTION
examTEA FOUNCTION = INIT;

BOOL CDialogTEA::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: ADD extra initialization here
	//创建记录集对象
	m_pRecordset.CreateInstance(__uuidof(Recordset));
	m_pRecordsetSTU.CreateInstance(__uuidof(Recordset));
	m_pRecordsetCOU.CreateInstance(__uuidof(Recordset));


	//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
    //因为它有时会经常出现一些想不到的错误
	try
	{
		//从SQL数据库中打开TEACHERS表
		m_pRecordset->Open("SELECT * FROM TEACHERS", 
							theApp.m_pConnection.GetInterfacePtr(),
							adOpenDynamic,
							adLockOptimistic,
							adCmdText);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}

	_variant_t var;
	CString str;		
	
	try
	{
		if(!m_pRecordset->BOF)
		{
			m_pRecordset->MoveFirst();
		}
		//如果表内数据为空,设置控件属性并初始对话框
		else
		{
			AfxMessageBox("表内数据为空");
			m_btnQuery.EnableWindow(FALSE);
			m_btnDelete.EnableWindow(FALSE);
			m_btnModify.EnableWindow(FALSE);
			m_btnFirst.EnableWindow(FALSE);
			m_btnPre.EnableWindow(FALSE);
			m_btnNext.EnableWindow(FALSE);
			m_btnLast.EnableWindow(FALSE);
			m_btnOK.SetFocus();	
			return TRUE;
		}
		//
		// 读入库中首字段并加入控件中
		//
		//更新编辑框m_TeaID		
		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal ;

        //更新编辑框m_TeaName
		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

        //更新组合框m_TeaSex
		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

        //更新编辑框m_TeaStatus
		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str; 

        //更新编辑框m_TeaWay
		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;

	    //更新所有控件显示
		UpdateData(false);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDialogTEA::OnButtonQuery() 
{
	// TODO: ADD your control notification handler code here	
	m_TeaID = 0;
	m_TeaStatus = "";
	m_TeaName = "";
	m_TeaSex = "";
	m_TeaWay  = "";
	UpdateData(false);
    //更新FOUNCTION值
	FOUNCTION = SEARCH;	
	//修改各个矩形按钮的属性
	m_btnQuery.SetState(TRUE);
	m_btnAdd.EnableWindow(FALSE);
	m_btnDelete.EnableWindow(FALSE);
	m_btnModify.EnableWindow(FALSE);
	m_btnFirst.EnableWindow(FALSE);
	m_btnPre.EnableWindow(FALSE);
	m_btnNext.EnableWindow(FALSE);
	m_btnLast.EnableWindow(FALSE);
	m_btnOK.SetFocus();
}

//////////////////////////
//
//执行查找功能
//
/////////////////////////
void CDialogTEA::Query()
{
	//定义变量
	_variant_t var;
	CString str;
	//更新控件变量的值
	UpdateData(true);

	try
	{
		m_pRecordset->MoveFirst();
		while(!m_pRecordset->adoEOF)
		{
			var = m_pRecordset->GetCollect("TeaID");			
			if(m_TeaID == var.iVal)
			{
				var = m_pRecordset->GetCollect("TeaID");
				if(var.vt != VT_NULL)
				{
					m_TeaID = var.iVal;
				}

				var = m_pRecordset->GetCollect("TeaName");
				str = (LPCSTR)_bstr_t(var);
				m_TeaName = str;

				var = m_pRecordset->GetCollect("TeaSex");
				str = (LPCSTR)_bstr_t(var);
				m_TeaSex = str;

				var = m_pRecordset->GetCollect("TeaStatus");
				str = (LPCSTR)_bstr_t(var);
				m_TeaStatus = str; 

				var = m_pRecordset->GetCollect("TeaWay");
				str = (LPCSTR)_bstr_t(var);
				m_TeaWay = str;
			
				UpdateData(false);					
				break;
			}
			else 
			{
				m_pRecordset->MoveNext();
			}
		}
		if(m_pRecordset->adoEOF)
		{
			MessageBox("没有这个导师编号!");
		}
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}
}

//////////////////////////
//
//执行添加功能
//
/////////////////////////
void CDialogTEA::Add()
{
	//定义变量
	_variant_t var;
	CString str;
	//更新控件变量的值
	UpdateData(true);

    //判断要添加的导师号是否存在
	if(m_TeaID != 0 && !m_pRecordset->BOF)
	{
		m_pRecordset->MoveFirst();
		while(!m_pRecordset->adoEOF)
		{
			var = m_pRecordset->GetCollect("TeaID");
			if(m_TeaID == var.iVal)
			{
				AfxMessageBox("已经存在这个导师号!");
				break;
			}
			m_pRecordset->MoveNext();
		}
		if(!m_pRecordset->adoEOF)
		{
			return;
		}
	}

	if(m_TeaID == 0 || m_TeaName == "")
	{
		AfxMessageBox("姓名和编号信息不能为空!");	
		return;
	}
	else
	{
		try
		{
			//
			// 写入各字段值
			//
			m_pRecordset->AddNew();

			//写入TeaID字段
			var.iVal = m_TeaID;
			m_pRecordset->PutCollect("TeaID", var.iVal);

			//写入TeaName字段			
			m_pRecordset->PutCollect("TeaName", _variant_t(m_TeaName));

			//写入TeaSex字段
			m_pRecordset->PutCollect("TeaSex", _variant_t(m_TeaSex));

			//写入TeaStatus字段
			m_pRecordset->PutCollect("TeaStatus", _variant_t(m_TeaStatus));

			//写入TeaWay字段
			m_pRecordset->PutCollect("TeaWay", _variant_t(m_TeaWay));

			//更新SQL数据库
			m_pRecordset->Update();

			//当前记录移动到最后
			m_pRecordset->MoveLast();

			AfxMessageBox("插入成功!");			
		}
		catch(_com_error *e)
		{
			AfxMessageBox(e->ErrorMessage());
		}
	}
}

//////////////////////////
//
//执行删除功能
//
/////////////////////////
void CDialogTEA::Delete()
{
	//定义变量
	_variant_t var;
	CString str;	

	//判断当前是否有记录
	if(m_TeaID == 0)
	{
		MessageBox(" 没有记录!");
		return;
	}
	//判断是否作为外键被使用
	str.Format("select * from STUDENTS where TeaID = %d",m_TeaID);
	m_pRecordsetSTU->Open(str.AllocSysString(), 
							theApp.m_pConnection.GetInterfacePtr(),
							adOpenDynamic,
							adLockOptimistic,
							adCmdText);
	if(!m_pRecordsetSTU->BOF)
	{
		AfxMessageBox("此数据正在被其他表使用,不能删除!");
		m_pRecordsetSTU->Close();
		return;
	}
	else
	{
		m_pRecordsetSTU->Close();
	}
	//判断是否作为外键被使用
	str.Format("select * from COURSES where CouTea = %d",m_TeaID);
	m_pRecordsetCOU->Open(str.AllocSysString(), 
							theApp.m_pConnection.GetInterfacePtr(),
							adOpenDynamic,
							adLockOptimistic,
							adCmdText);
	if(!m_pRecordsetCOU->BOF)
	{
		AfxMessageBox("此数据正在被其他表使用,不能删除!");
		m_pRecordsetCOU->Close();
		return;
	}
	else
	{
		m_pRecordsetCOU->Close();
	}

	try
	{
		//
		// 删除当前行记录
		//
		m_pRecordset->Delete(adAffectCurrent);
		m_pRecordset->Update();
		m_pRecordset->MoveFirst();

		//判断删除后表内数据是否为空
		if(m_pRecordset->BOF)
		{
			AfxMessageBox("表内数据已经为空!");
			m_btnQuery.EnableWindow(FALSE);
			m_btnDelete.EnableWindow(FALSE);
			m_btnModify.EnableWindow(FALSE);
			m_btnFirst.EnableWindow(FALSE);
			m_btnPre.EnableWindow(FALSE);
			m_btnNext.EnableWindow(FALSE);
			m_btnLast.EnableWindow(FALSE);
			m_btnOK.SetFocus();	
			return;
		}

		//显示最后一条记录
		m_pRecordset->MoveLast();

		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal ;

		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str; 

		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;
	
		UpdateData(false);				
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}
}

//////////////////////////
//
//执行修改功能
//
/////////////////////////
void CDialogTEA::Modify()
{
	//定义变量
	_variant_t var;
	CString str;
	//更新控件变量的值
	UpdateData(true);

	if(m_TeaID == 0 || m_TeaName == "")
	{
		AfxMessageBox("姓名和年龄信息不能为空!");
		return;
	}
	//
	// 修改当前记录的字段值
	//
	try
	{
		var.iVal = m_TeaID;
		m_pRecordset->PutCollect("TeaID", var.iVal);
		
		m_pRecordset->PutCollect("TeaName", _variant_t(m_TeaName));

		m_pRecordset->PutCollect("TeaSex", _variant_t(m_TeaSex));

		m_pRecordset->PutCollect("TeaStatus", _variant_t(m_TeaStatus));

		m_pRecordset->PutCollect("TeaWay", _variant_t(m_TeaWay));

		m_pRecordset->Update();

		AfxMessageBox("修改成功!");			
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}
}

void CDialogTEA::OnButtonOK() 
{
	// TODO: ADD your control notification handler code here	
	if(FOUNCTION == SEARCH)
	{
		Query();		
	}	
	else if(FOUNCTION == ADD)
	{
		Add();		
	}	
	else if(FOUNCTION == DEL)
	{
		Delete();		
	}	
	else if(FOUNCTION == MODIFY)		
	{
		Modify();		
	}	
}

void CDialogTEA::OnButtonGoBack() 
{
	// TODO: ADD your control notification handler code here	
	//关闭记录集,退出
	m_pRecordset->Close();
	OnCancel();	
}

void CDialogTEA::OnButtonAdd() 
{
	// TODO: ADD your control notification handler code here
	//
	//给所有显示控件一个添加之前的初值
	//
	m_TeaID = 0;
	m_TeaStatus = "";
	m_TeaName = "";
	m_TeaSex = "男";
	m_TeaWay  = "";
	UpdateData(false);
	//更新FOUNCTION值
	FOUNCTION = ADD;
	//修改各个矩形按钮的属性
	m_btnQuery.EnableWindow(FALSE);
	m_btnAdd.SetState(TRUE);
	m_btnDelete.EnableWindow(FALSE);
	m_btnModify.EnableWindow(FALSE);
	m_btnFirst.EnableWindow(FALSE);
	m_btnPre.EnableWindow(FALSE);
	m_btnNext.EnableWindow(FALSE);
	m_btnLast.EnableWindow(FALSE);
	m_btnOK.SetFocus();	
}

void CDialogTEA::OnButtonDelete() 
{
	// TODO: ADD your control notification handler code here
	if(MessageBox("真的删除?\n是请按“是”,\n否请按“否”!", NULL, MB_YESNO | MB_ICONQUESTION) == IDYES)
	{
		//更新FOUNCTION值
		FOUNCTION = DEL;
		OnButtonOK();
	}
	else
	{
		OnButtonCancel();
	}
}

void CDialogTEA::OnButtonModify() 
{
	// TODO: ADD your control notification handler code here
	//更新FOUNCTION值
	FOUNCTION = MODIFY;
	m_ctlTeaID.SetReadOnly();
	//修改各个矩形按钮的属性
	m_btnQuery.EnableWindow(FALSE);
	m_btnAdd.EnableWindow(FALSE);
	m_btnDelete.EnableWindow(FALSE);
	m_btnModify.SetState(TRUE);
	m_btnFirst.EnableWindow(FALSE);
	m_btnPre.EnableWindow(FALSE);
	m_btnNext.EnableWindow(FALSE);
	m_btnLast.EnableWindow(FALSE);
	m_btnOK.SetFocus();
}

void CDialogTEA::OnButtonFirst() 
{
	// TODO: ADD your control notification handler code here
	m_pRecordset->MoveFirst();
	_variant_t var;
	CString str;		
	
	try
	{
		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal ;

		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str; 

		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;
	
		UpdateData(false);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}	
}

void CDialogTEA::OnButtonPre() 
{
	// TODO: ADD your control notification handler code here
	
	m_pRecordset->MovePrevious();
	_variant_t var;
	CString str;	
	if(m_pRecordset->BOF)
	{
		MessageBox("已经是首记录!");
	    m_pRecordset->MoveFirst();
	}
	
	try
	{
		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal;

		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str; 

		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;
	
		UpdateData(false);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}	
}

void CDialogTEA::OnButtonNext() 
{
	// TODO: ADD your control notification handler code here
	m_pRecordset->MoveNext();
	_variant_t var;
	CString str;
	
	if(m_pRecordset->adoEOF)
	{
		MessageBox("已经是末记录!");
	    m_pRecordset->MoveLast();
	}
	
	try
	{
		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal;

		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str; 

		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;
	
		UpdateData(false);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}	
}

void CDialogTEA::OnButtonLast() 
{
	// TODO: ADD your control notification handler code here
	m_pRecordset->MoveLast();
	_variant_t var;
	CString str;		
	
	try
	{
		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal;

		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str; 

		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;
	
		UpdateData(false);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}	
}

void CDialogTEA::OnButtonCancel() 
{
	// TODO: ADD your control notification handler code here
	_variant_t var;
	CString str;
	FOUNCTION=INIT;
	//如果表为空,返回不做下面的操作
	if(m_pRecordset->BOF)
	{
		m_btnAdd.SetState(false);
		return;
	}	

	//修改各个矩形按钮的属性
	m_btnQuery.EnableWindow(true);
	m_btnAdd.EnableWindow(true);
	m_btnDelete.EnableWindow(true);
	m_btnModify.EnableWindow(true);
	m_btnFirst.EnableWindow(true);
	m_btnPre.EnableWindow(true);
	m_btnNext.EnableWindow(true);
	m_btnLast.EnableWindow(true);

	m_btnQuery.SetState(false);
	m_btnAdd.SetState(false);
	m_btnDelete.SetState(false);
	m_btnModify.SetState(false);
	m_btnFirst.SetState(false);
	m_btnPre.SetState(false);
	m_btnNext.SetState(false);
	m_btnLast.SetState(false);

	m_ctlTeaID.SetReadOnly(FALSE);
	m_btnOK.SetFocus();	
	//
	//把m_pRecordset所指当前记录显示出来
	//
	if(m_pRecordset->adoEOF)
	{
		m_pRecordset->MoveLast();
	}
	try
	{
		var = m_pRecordset->GetCollect("TeaID");
		if(var.vt != VT_NULL)		
		m_TeaID = var.iVal;

		var = m_pRecordset->GetCollect("TeaName");
		str = (LPCSTR)_bstr_t(var);
		m_TeaName = str;

		var = m_pRecordset->GetCollect("TeaSex");
		str = (LPCSTR)_bstr_t(var);
		m_TeaSex = str;

		var = m_pRecordset->GetCollect("TeaStatus");
		str = (LPCSTR)_bstr_t(var);
		m_TeaStatus = str;

		var = m_pRecordset->GetCollect("TeaWay");
		str = (LPCSTR)_bstr_t(var);
		m_TeaWay = str;
	
		UpdateData(false);
	}
	catch(_com_error *e)
	{
		AfxMessageBox(e->ErrorMessage());
	}	
}