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
评论