VC++使用列表控件显示数据库中的数据(移动记录集指针遍历记录集)
2015-05-03 09:11
316 查看
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中编译运行程序。
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中编译运行程序。
相关文章推荐
- Atlas入门-将普通控件升级为Atlas控件/使用listView显示数据库数据[视频]
- 日历控件Calendar使用技巧--根据数据库数据控制日期背景显示颜色
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- Android中Spinner下拉列表(使用自定义Adapter实现,显示数据取自联系人数据库)
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- 使用ADO实现vc中二进制文件数据的存取(以图像在数据库中的存取为例)
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- VC中点击ComboBox下拉列表不显示数据的解决方法
- VC中点击ComboBox下拉列表不显示数据的解决方法
- 数据库中datetime类型数据显示到Listcontrol控件中
- VC中怎样使用列表控件
- [C#] 检索数据库并用DataGridView 控件显示数据.
- C# 程序中如何向(DEV)ComboBoxEdit控件中添加下拉列表的值不使用数据绑定,就是使用代码添加
- vc 在edit控件中动态插入数据滚动显示
- 将数据库中的数据通过 client 控件显示 (一个asp和javascript传参数的列子)
- SolpartMenu的使用:(二)、在ASP.NET页面中使用SolpartMenu控件之动态的加载数据库中的数据来生成菜单
- 使用嵌套的Repeater控件显示分级数据
- 使用嵌套的Repeater控件显示分级数据
- 多层数据库开发十二:使用数据控件