正文

vc数据库编程-mfc odbc2007-08-28 17:25:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/28915.html

分享到:

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;
 */
}

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1367491

阅读(3654) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册