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