您的位置:首页 > 编程语言 > C语言/C++

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中编译运行程序。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐