VC++使用列表控件显示数据库中的数据(移动记录集指针遍历记录集)

14 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值