开始学习MFC数据库编程

转贴!Vc数据库编程—MFC-ODBC
1. 连接数据库
CDatabase conn;
conn.OpenEx(_T("DSN=bbodbc"));
2. 执行更新
conn.ExecuteSQL(updateSQL);
3.CRecordset 初始化
rst = new CRecordset(&conn);  // 指针
或者下面的也可以
rst.m_pDatabase = &conn;
  // 针对非指针
4. 执行查询
rst->Open(AFX_DB_USE_DEFAULT_TYPE, selectSQL);
5. 处理记录集
 CRecordset *rst = bb.executeSelect(_T("select * from userinfo"));
 try {
  int iListIndex = 0;
  while (!rst->IsEOF())
  {
   CString strID, strName;
   rst->GetFieldValue("userid", strID);
   rst->GetFieldValue("username", strName);
   //MessageBox(strFiledValue);
   m_listbox.AddString(strName);
   m_list2.InsertItem(iListIndex, strID);
   m_list2.SetItemText(iListIndex, 1, strName);
   iListIndex++;
   rst->MoveNext();
  }
  rst->Close();
 }
 catch (CDBException *ex)
 {
  AfxMessageBox(ex->m_strError);
 }
其中 bb  为封装的一个 ODBC 的操作的对象
 
下面提供简单的 ODBC 封装类:

注意在预编译头文件 (StdAfx.h) 中包含
i nclude <afxdb.h> // 这个投文件中包含数据库的基本类
注意链接的关闭处理
class CBBODBC 
{
public:
 CBBODBC();
 virtual ~CBBODBC();
 void connect();
 void connect(const CString szDSN);
 void close();
 void executeUpdate(const CString updateSQL);
 CRecordset* executeSelect(const CString selectSQL);
private:
 CDatabase conn;
 CRecordset *rst;
 //CRecordset rst;
 CString static m_connstr;
};
i nclude "stdafx.h"
i nclude "BBODBC.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
/*
1.
数据库操作的两种方式, RFX, 自己定义操作
2.
连接数据库的方式
3.
执行更新,查询,处理查询结果
4.AddNew
等操作
*/
CBBODBC::CBBODBC()
{
 connect();
 rst = new CRecordset(&conn);
 //rst.m_pDatabase = &conn;
}
CBBODBC::~CBBODBC()
{
 close();
}
// 使用 openEx 要:  _T("DSN=bbodbc")
//
但使用 open 较随意: _T("bbodbc") 即可
CString CBBODBC::m_connstr(_T("DSN=bbodbc"));

void CBBODBC::connect()
{
 connect(m_connstr);
}
void CBBODBC::connect(const CString szDSN)
{
 if (!conn.IsOpen())
  conn.OpenEx(szDSN);
}
void CBBODBC::close()
{
 if (NULL != rst)
 {
  if(rst->IsOpen())
   rst->Close();
  delete(rst);
  rst = NULL; //
此处比较重要
 }
 if(conn.IsOpen())
  conn.Close();
}
void CBBODBC::executeUpdate(const CString updateSQL)
{
 conn.ExecuteSQL(updateSQL);
}
/*
此处返回 rst 的指针,可以不用类成员变量,直接定义一个 CRecordset* ,然后返回,
在调用时,会传递这个指针,但要在调用函数中关闭,并删除指针指向内存。
如果写到类成员里,可以在类内部控制指针指向内存的删除,但不知道公用 CRecordset*
不会出现问题。
*/
CRecordset* CBBODBC::executeSelect(const CString selectSQL)
{
 rst->Open(AFX_DB_USE_DEFAULT_TYPE, selectSQL);
 return rst;
 /*
 CRecordset rs(&conn);
 rs.Open(AFX_DB_USE_DEFAULT_TYPE, selectSQL);
 while(!rs.IsEOF())
 {
  CString str;
  rs.GetFieldValue(1, str);
  AfxMessageBox(str);
  rs.MoveNext();
 }
 return NULL;
 */
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值