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();
}