1、创建一个基于对话框的MFC应用程序,命名为SeeData。
2、向资源视图中的主对话框中添加一个列表视图控件。ID默认。关联一个变量为m_grid。
3、在类视图中添加一个数据库连接类ADOConn。
ADOConn.h:
// ADOConn.h: interface for the ADOConn class.
//
//
#if !defined(AFX_ADOCONN_H__164F92AB_6A55_4631_AC13_ABCF4F29EE16__INCLUDED_)
#define AFX_ADOCONN_H__164F92AB_6A55_4631_AC13_ABCF4F29EE16__INCLUDED_
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF1")rename("BOF","adoBOF1")
//链接动态库msado15.dll
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
public:
BOOL ExecuteSQL(_bstr_t bstrSQL); //执行SQL语句
void ExitConnect(); //退出数据库连接
void CloseRecordset(); //关闭记录集
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); //通过SQL语句获得记录集
void OnInitADOConn(); //初始化数据库连接
_RecordsetPtr m_pRecordset; //声明记录集对象
_ConnectionPtr m_pConnection; //声明一个连接对象指针
ADOConn();
virtual ~ADOConn();
};
#endif // !defined(AFX_ADOCONN_H__164F92AB_6A55_4631_AC13_ABCF4F29EE16__INCLUDED_)
//=============================================================================================
ADOConn.cpp:
// ADOConn.cpp: implementation of the ADOConn class.
//
//
#include "stdafx.h"
#include "SeeData.h"
#include "ADOConn.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}
void ADOConn::OnInitADOConn() //连接数据库
{
//初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
//创建connection对象
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串
_bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Telephone;Data Source=."; //数据库名为Telephone。
//SERVER和UID,PWD的设置根据实际情况来设置
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
//捕捉异常
catch(_com_error e)
{
//显示错误信息
AfxMessageBox(e.Description());
}
}
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL) //打开记录集
{
try
{
//连接数据库,如果connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn(); //初始化数据库连接
//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
e.Description();
}
//返回记录集
return m_pRecordset;
}
void ADOConn::CloseRecordset() //关闭记录集
{
if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态
m_pRecordset->Close(); //关闭记录集
}
void ADOConn::ExitConnect() //关闭数据库连接
{
//关闭记录集和连接
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
}
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL) //执行SQL语句。用来执行不返回记录集的SQL语句,如inset、Update和Delete
{
_variant_t RecordsAffected;
try
{
//是否已连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//connection对象的Execute方法(_bstr_t CommandText,
//VARIANT * RecordsAffected,long Options)
//其中CommandText是命令字符串,通常是SQL命令
//参数RecordsAffected是操作完成后所影响的行数
//参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTable-表名
//adCmdStoredProc-存储过程,adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
e.Description();
return false;
}
}
4、在SeeDataDlg.cpp的OnInitDialog函数中添加如下代码,用于将数据库中的记录添加到列表视图中:
// TODO: Add extra initialization here
m_grid.SetExtendedStyle(LVS_EX_FLATSB //初始化列表
|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
|LVS_EX_ONECLICKACTIVATE
|LVS_EX_GRIDLINES);
m_grid.InsertColumn(0,"姓名",LVCFMT_LEFT,100,0); //为列表加入四列:姓名,手机号码,关系,备注
m_grid.InsertColumn(1,"手机号码",LVCFMT_LEFT,100,1);
m_grid.InsertColumn(2,"关系",LVCFMT_LEFT,100,2);
m_grid.InsertColumn(3,"性别",LVCFMT_LEFT,100,3);
m_grid.InsertColumn(4,"备注",LVCFMT_LEFT,100,4);
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn(); //打开数据库连接
CString sql;
sql.Format("select* from contact order by 手机号码 asc"); //使用sql代表SQL语句表名为contact。通过列“手机号码”按升序排列(asc),按降序排列(desc)
_RecordsetPtr m_pRecordset; //声明记录集对象
m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql); //获得sql语句检索得的记录集。
while(m_AdoConn.m_pRecordset->adoEOF1==0) //如果未检索到记录集最后一行,就为列表行添加检索到的数据。遍历记录集。
{
m_grid.InsertItem(0,"");
m_grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));
m_grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("手机号码")); //记录集选择的列表名在数据库中必须能够找到,不然出错。
m_grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("关系"));
m_grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("性别"));
m_grid.SetItemText(0,4,(char*)(_bstr_t)m_pRecordset->GetCollect("备注"));
m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
return TRUE; // return TRUE unless you set the focus to a control
5、在SeeData.cpp文件的InitInstance()函数中添加:
//=================================================
::CoUninitialize(); //释放COM环境
//==============================================
6、在本机的SQLServer的企业管理器中新建一个数据库Telephone,在库中新建一个表contact,在表中添加5个列:姓名,手机号码,关系,性别,备注。数据类型为char。
然后完善该表。
7、在VC中编译运行程序。