MFC里用ADO方式连接数据库
1.在stdafx.h文件中添加如下代码
#import \ \\ no_namespace \\
rename (\, \)
用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename (\\说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
2. 定义_ConnectionPtr变量调用Connection对象的Open方法建立与服务器的连
接。
UpdateData(true);
//_ConnectionPtr m_pConnection;//声明一个Connection指针
HRESULT hr=m_pConnection.CreateInstance(\);//创建Connection对象
//定义初始化的连接参数
CString
strConnection=_T(\);//服务器名称为local
strConnection+=m_datasource;//数据库名称 strConnection+=\;
strConnection+=m_user; //登陆名 strConnection+=\;
strConnection+=m_password; //登陆密码
//把CString转换为 _bstr_t型 _bstr_t bstrSRC(strConnection);
//用try。。。catch()来捕获错误信息 try {
m_pConnection->Open(bstrSRC,\,\,adModeUnknown);//打开我们的链接库
MessageBox(_T(\登陆成功!\)); }
catch(_com_error &e) {
MessageBox(e.Description(),_T(\),MB_OK|MB_ICONINFORMATION); }
这样就连接上了我的数据库。
3. _RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
——打开数据表。打开库内表名为xs的数据表,代码如下:
_RecordsetPtr m_pRecordset; _variant_t var;
CString strsql = _T(\);//具体执行的SQL语句 m_pRecordset =
m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);//将查询数据导入m_pRecordset数据容器 //读取并显示记录 for(int i=0;i<3;i++) {
while(!m_pRecordset->adoEOF)//遍历列的记录 {
var = m_pRecordset->GetCollect(\);//获取当前记录指针所指的字段值
CString xh = (TCHAR*)(_bstr_t)var; //转换为CString型 var = m_pRecordset->GetCollect(\); CString name = (TCHAR*)(_bstr_t)var; var = m_pRecordset->GetCollect(\); CString age = (TCHAR*)(_bstr_t)var; //显示到listCtrl中
m_list.InsertItem(i,xh);
m_list.SetItemText(i,1,name); m_list.SetItemText(i,2,age); //UpdateData(false);
m_pRecordset->MoveNext();//移向下一条记录 } }
在BOOL CADOTest1Dlg::OnInitDialog()中添加listCtrl的初始化:
// TODO: 在此添加额外的初始化代码 CRect rect;
m_list.GetClientRect(&rect);
// 为列表视图控件添加全行选中和栅格风格
m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 为列表视图控件添加两列
m_list.InsertColumn(0, _T(\), LVCFMT_LEFT, rect.Width()/3, 0);//列索引,列标题,对齐方式,列宽,对应列表子项索引
m_list.InsertColumn(1, _T(\), LVCFMT_LEFT, rect.Width()/3, 1);
m_list.InsertColumn(2, _T(\), LVCFMT_LEFT, rect.Width()/3, 2);
4.数据库添加操作,编辑“添加”的消息响应函数:
void CADOTest1Dlg::OnBnClickedButton1() {
// TODO: 在此添加控件通知处理程序代码
if(FAILED(m_pRecordset.CreateInstance(\))) {
return; }
try {
m_pRecordset->Open(_variant_t(_T(\)),_variant_t((IDispatch*)m_pConnection),adOpenKeyset,adLockOptimistic,adCmdTable);
}
catch(_com_error &e) {
MessageBox(e.Description(),_T(\),MB_OK); }
//存入数据
CString strSql = _T(\张曼玉','16')\); //具体的SQL语句 //将查询数据导入m_pRecordset m_pRecordset =
m_pConnection->Execute(_bstr_t(strSql),NULL,adCmdText); }
5.删除操作只需要将上述函数里的存入数据语句改为:
CString strSql = _T(\