转贴!Vc数据库编程—MFC-ODBC
void CBBODBC::connect()
{
connect(m_connstr);
}
1.
连接数据库
CDatabase conn;
conn.OpenEx(_T("DSN=bbodbc"));
CDatabase conn;
conn.OpenEx(_T("DSN=bbodbc"));
2.
执行更新
conn.ExecuteSQL(updateSQL);
3.CRecordset
初始化
rst = new CRecordset(&conn); //
指针
或者下面的也可以
rst.m_pDatabase = &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);
}
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> // 这个投文件中包含数据库的基本类
注意在预编译头文件 (StdAfx.h) 中包含
# i nclude <afxdb.h> // 这个投文件中包含数据库的基本类
注意链接的关闭处理
class CBBODBC
{
public:
CBBODBC();
virtual ~CBBODBC();
{
public:
CBBODBC();
virtual ~CBBODBC();
void connect();
void connect(const CString szDSN);
void close();
void executeUpdate(const CString updateSQL);
CRecordset* executeSelect(const CString selectSQL);
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;
};
CDatabase conn;
CRecordset *rst;
//CRecordset rst;
CString static m_connstr;
};
#
i nclude "stdafx.h"
# i nclude "BBODBC.h"
# i nclude "BBODBC.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
// Construction/Destruction
//
/*
1. 数据库操作的两种方式, RFX, 自己定义操作
2. 连接数据库的方式
3. 执行更新,查询,处理查询结果
4.AddNew 等操作
*/
CBBODBC::CBBODBC()
{
connect();
rst = new CRecordset(&conn);
//rst.m_pDatabase = &conn;
}
1. 数据库操作的两种方式, RFX, 自己定义操作
2. 连接数据库的方式
3. 执行更新,查询,处理查询结果
4.AddNew 等操作
*/
CBBODBC::CBBODBC()
{
connect();
rst = new CRecordset(&conn);
//rst.m_pDatabase = &conn;
}
CBBODBC::~CBBODBC()
{
close();
}
{
close();
}
//
使用
openEx
要:
_T("DSN=bbodbc")
// 但使用 open 较随意: _T("bbodbc") 即可
CString CBBODBC::m_connstr(_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);
}
{
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();
}
{
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);
}
{
conn.ExecuteSQL(updateSQL);
}
/*
此处返回 rst 的指针,可以不用类成员变量,直接定义一个 CRecordset* ,然后返回,
在调用时,会传递这个指针,但要在调用函数中关闭,并删除指针指向内存。
如果写到类成员里,可以在类内部控制指针指向内存的删除,但不知道公用 CRecordset* 会
不会出现问题。
*/
CRecordset* CBBODBC::executeSelect(const CString selectSQL)
{
此处返回 rst 的指针,可以不用类成员变量,直接定义一个 CRecordset* ,然后返回,
在调用时,会传递这个指针,但要在调用函数中关闭,并删除指针指向内存。
如果写到类成员里,可以在类内部控制指针指向内存的删除,但不知道公用 CRecordset* 会
不会出现问题。
*/
CRecordset* CBBODBC::executeSelect(const CString selectSQL)
{
rst->Open(AFX_DB_USE_DEFAULT_TYPE, selectSQL);
return rst;
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;
*/
}
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;
*/
}