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_FILEstatic 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

评论