文章出处: 星魂工作室 独孤残云
MFC以ADO连接数据库的方法大致分为如下几个步骤:
1.在Stdafx.h中引入相应的dll文件
#import "c:/program files/common files/system/ado/msado15.dll" / no_namespace / rename ("EOF", "adoEOF")
2.在相应的App文件中声明连接变量
_ConnectionPtr m_pConnection; //多为public类型
3.在相应的App文件的InitInstance()函数中构建变量m_pConnection的实例
AfxOleInit();//初始化相应的Com环境(这一句是必不可少的!!!) m_pConnection.CreateInstance(__uuidof(Connection)); // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息, // 因为它有时会经常出现一些想不到的错误。(在后面的代码中我们省略这一步,以此类推) try { // 打开本地Access库Demo.mdb m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown); } catch(_com_error e) { AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!"); return FALSE; }
4.在相应的Dlg文件中声明相应的连接变量
_ConnectionPtr m_pConnection; _CommandPtr m_pCommand; _RecordsetPtr m_pRecordset;
5.在相应的Dlg的OnInitDialog()中声明ListControl的风格
( 此之前一定要记得为相应的ListControl控件添加相应的变量m_List !!! )
DWORD dwStyle; // 设置新风格 dwStyle=::GetWindowLong(m_List.m_hWnd,GWL_STYLE); dwStyle|=LVS_REPORT | LVS_SHOWSELALWAYS | LVS_EDITLABELS; ::SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle); dwStyle=m_List.GetExtendedStyle(); dwStyle|=LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT; m_List.SetExtendedStyle(dwStyle); m_List.InsertColumn(0,"Columnname1",LVCFMT_CENTER,60); m_List.InsertColumn(1,"Columnname2",LVCFMT_CENTER,60); //初始化ListControl控件的各个列
6.声明相应的读取数据库函数ReadList()
void CMyClass::ReadList() { UpdateData(); m_List.DeleteAllItems();//首先将ListControl中已有的数据清空,而后重新从数据库读入,以实现刷新效果 CString SQL,Columnname1,Columnname2......; /*****************************通过以下两句代码即可实现实质上的以SQL语句操控数据库***************************/ SQL.Format("select /*列名*/,MajorName from Tablename where mdbColumnname1='%s'",m_Columnname1); /*声明相应的SQL语句*/ m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);/*记录集指针执行SQL语句*/ /*********************************************************************************************************************************/ int Counter=0; if(!(m_pRecordset->BOF))//若记录集指针未指向数据库中的首元素 { m_pRecordset->MoveFirst();//则将其指向首元素位置 while (!m_pRecordset->adoEOF)//若记录集指针未指向数据库中的尾元素,则循环永远不会结束 { Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname1"); Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname2"); //............................... m_List.InsertItem(Counter,0); m_List.SetItemText(Counter,0,Columnname1);//其中的Counter为行号;0为列号即字段号 m_List.SetItemText(Counter,1,Columnname2);//同上 //........................................... m_pRecordset->MoveNext(); Counter++; } } UpdateData(false); }
7.声明相应的添加记录函数AddList()
void CMyClass::AddList() { CString SQL,m_Columnname1,m_Columnname2........;//声明SQL暂存字符串及其他可能用到的数据库字段暂存变量 UpdateData(); int editmajorno=atoi(dlg.m_editmajorno); SQL.Format("Insert into .../*Tablename*/... (/*Columnnames*/.......) Values (........)",m_Columnname1,m_Columnname2,.......); theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);/*记录集指针执行SQL语句*/ ReadList(SQL); }
8.声明相应的删除记录函数DelList()
void CMyClass::DelList() { // TODO: Add your control notification handler code here CString SQL; POSITION pos=m_List.GetFirstSelectedItemPosition(); int n=m_List.GetNextSelectedItem(pos); char m_ID[30]={'/0'}; m_List.GetItemText(n,0,m_ID,sizeof(m_ID)); SQL.Format("Delete from Tablename where ID='%s'",m_ID); theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText); ReadList(SQL); }
9.声明相应的修改记录函数UpdList();
void CMAJOR::OnUpdmajor() { CString SQL; POSITION pos=m_List.GetFirstSelectedItemPosition(); int n=m_List.GetNextSelectedItem(pos); char m_ID[30]={'/0'}; m_List.GetItemText(n,0,m_ID,sizeof(m_ID)); UpdateData(); SQL.Format("Update tablename Set Columnname1='%s',Columnname2='% s',......",m_Columnname1,m_Columnname2......); theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);/*记录集指针执行SQL语句*/ ReadList(SQL); }
10.以下是针对于ListControl的一些常用函数(补充中。。。)
1>m_List.InsertColumn(0,"name",LVCFMT_CENTER,60);
说明:该函数可快速实现ListControl控件相应字段的初始化
参数一:字段索引
参数二:字段名称
参数三:字段显示方式(样例中为居中显示)
参数四:字段默认宽度(样例中为60)
2>POSITION pos=m_List.GetFirstSelectedItemPosition();
说明:获得控件中当前选中记录的位置
int n=m_List.GetNextSelectedItem(pos);
说明:由位置转化得到当前选中记录的行数
m_List.GetItemText(n,0,m_ID,sizeof(m_ID));
说明:获得当前选中记录中的某一个字段名
参数一:行数
参数二:列数
参数三:字段名的暂存变量
参数四:暂存变量的长度