MFC操作Access数据库

1、在头文件中导入ADO连接库

//导入ADO连接库
#import "C:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF","adoEof")
//定义变量
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;

2、初始化窗口时打开连接等

// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

// TODO:  在此添加额外的初始化代码
//初始化ADO COM
AfxOleInit();
//初始化列表控件
LV_COLUMN listColum;
TCHAR* listTitle[2] = { _T("学号"), _T("姓名") };//定义列的名称
int intColCx[2] = { 100, 120 };
listColum.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;//指定列表控件的样式
listColum.fmt = LVCFMT_LEFT;//左对齐
for (int i = 0; i < 2; i++)
{
	listColum.cx = intColCx[i];
	listColum.iSubItem = i;
	listColum.pszText = listTitle[i];
	m_list.InsertColumn(i, &listColum);
}
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);//选中所有的行
m_pConnection.CreateInstance(__uuidof(Connection));//创建连接对象
//构建连接字符串
CString strConn = _T("Provider=Microsoft.ACE.OLEDB.12.0;;Data Source=C:\\Users\\admin\\Desktop\\DataBaseDome.mdb");
try{
	//打开Access数据库 的连接
	m_pConnection->Open((_bstr_t)strConn, _T(""), _T(""), adModeUnknown);//adModeUnknown 默认参数
}
catch(_com_error&e){
	AfxMessageBox((LPCTSTR)e.Description());
	m_pConnection = NULL;
	return TRUE;
}
catch (...)
{
	AfxMessageBox(_T("未知错误"));
	m_pConnection = NULL;
	
	return TRUE;
}
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集对象
GetDataSet();
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

3、加载数据

void CAdoMFcAADlg::GetDataSet()
{
	LPCTSTR lpSql = _T("select *from Student order by StudentID");
	m_pRecordset->Open((_variant_t)lpSql, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
	if (m_pRecordset == NULL)
	{
		AfxMessageBox(_T("读取数据记录发生错误"));
		return ;
	}
	m_list.DeleteAllItems();
	int nItem = 0;
	_variant_t id, name;//从数据读出的类型是_variant_t
	CString strID, strName;
	while (!m_pRecordset->adoEof)
	{
		id = m_pRecordset->GetCollect(_T("StudentID"));
		name = m_pRecordset->GetCollect(_T("StudentName"));

		//转化为C++的类型
		strID.Format(_T("%d"), id.intVal);
		strName = (LPCTSTR)_bstr_t(name);
		//AfxMessageBox(strName);
		m_list.InsertItem(nItem, strID);
		m_list.SetItemText(nItem, 1, strName);
		m_list.SetItemData(nItem, id.intVal);
		nItem++;

		m_pRecordset->MoveNext();
	}
	m_pRecordset->Close();//关闭记录集
}

4、增加数据

void CAdoMFcAADlg::OnBnClickedBtnAdd()
{
	// TODO:  在此添加控件通知处理程序代码
	int nID = GetDlgItemInt(IDC_EDT_ID);
	CString strName;
	GetDlgItemText(IDC_EDT_NAME, strName);

	if (strName.GetLength()==0)
	{
		AfxMessageBox(_T("学生姓名不能为空"));
		return;
	}
	if (nID<=0)
	{
		AfxMessageBox(_T("学生学号不能为空"));
	}

	//检查学号是否重复

	//处理姓名中的单引号,避免受到sql注入
	strName.Replace(_T("'"), _T("''"));
	TCHAR szSql[1024] = { 0 };
	_stprintf(szSql, _T("insert into Student(StudentID,StudentName) values(%d,'%s')"),nID,(LPCTSTR)strName);
	ExcuteSql(szSql);
	GetDataSet();
}

void CAdoMFcAADlg::ExcuteSql(LPCTSTR lpSql)
{
	_variant_t ra;//删除了多少行
	try{
		m_pConnection->Execute(lpSql, &ra, adCmdText);
	}
	catch (_com_error&e)
	{
		AfxMessageBox((LPCTSTR)e.Description());
	}
	catch (...)
	{
		AfxMessageBox(_T("执行sql 语句失败"));
	}
	//GetDataSet();
}

更改

void CAdoMFcAADlg::OnBnClickedBtnUpdata()
{
	// TODO:  在此添加控件通知处理程序代码
	int nIndex = m_list.GetSelectionMark();
	if (nIndex<0)
	{
		return;
	}
	int nID = m_list.GetItemData(nIndex);
	int nNewID = GetDlgItemInt(IDC_EDT_ID);
	CString strNewName;
	GetDlgItemText(IDC_EDT_NAME, strNewName);
	if (strNewName.GetLength()==0||nNewID<=0)
	{
		return;
	}
	strNewName.Replace(_T("'"),_T("''"));
	TCHAR szSql[1024] = { 0 };
	_stprintf(szSql, _T("update Student set StudentID=%d,StudentName='%s' where StudentID=%d"), nNewID, strNewName, nIndex);
	ExcuteSql(szSql);
	GetDataSet();
}

删除

void CAdoMFcAADlg::OnBnClickedBtnDeleteNow()
{
	// TODO:  在此添加控件通知处理程序代码
	int nIndex = m_list.GetSelectionMark();//选中第几行
	//如果没有选中  就返回
	if (nIndex<0)
	{
		return;
	}
	int nID = m_list.GetItemData(nIndex);
	TCHAR szSql[1024] = { 0 };
	_stprintf(szSql,_T("delete from Student where StudentID=%d"),nID);
	ExcuteSql(szSql);
	//_variant_t ra;//删除了多少行
	//try{
	//	m_pConnection->Execute(szSql, &ra, adCmdText);
	//}
	//catch (_com_error&e)
	//{
	//	AfxMessageBox((LPCTSTR)e.Description());
	//}
	//catch (...)
	//{
	//	AfxMessageBox(_T("执行sql Delete 语句失败"));
	//}
	GetDataSet();
}
展开阅读全文

没有更多推荐了,返回首页