附上重要的程序源代码:
stdafx.h文件:
<code class="lang-cpp">// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
// ... 其它代码 ...
#include <afxdb.h></afxdb.h></code>
DataBaseTest1Dlg.h文件:
<code class="lang-cpp">// DataBaseTest1Dlg.h : 头文件
//
#pragma once
#include "afxwin.h"
// CDataBaseTest1Dlg 对话框
class CDataBaseTest1Dlg : public CDialog
{
// ... 其它代码 ...
public:
CComboBox m_combobox;
CDatabase m_dbfile;
// ... 其它代码 ...
};</code>
DataBaseTest1Dlg.cpp文件:
<code class="lang-cpp">// DataBaseTest1Dlg.cpp : 实现文件
//
// ... 其它代码 ...
void CDataBaseTest1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_combobox);
}
// ... 其它代码 ...
void CDataBaseTest1Dlg::OnBnClickedAdd()
{
CString str1;
m_combobox.GetWindowText(str1);
if (str1 != "") {
m_combobox.AddString(str1);
m_combobox.SetWindowText("");
SuspendDataToDB(); // 更新数据库
}
}
void CDataBaseTest1Dlg::OnBnClickedDel()
{
int cur = m_combobox.GetCurSel();
if (cur >= 0) { // 返回-1则没有选择任何对象
m_combobox.DeleteString(cur);
SuspendDataToDB(); // 更新数据库
}
}
void CDataBaseTest1Dlg::OnBnClickedDbopen()
{
CString sDriver = "Microsoft Access Driver (*.mdb)"; // 数据库引擎
CString sFile = "Database.mdb"; // 数据库路径
CString sConnect;
// 构造数据库的连接地址
sConnect.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
// 构造后的地址:"ODBC;DRIVER={Microsoft Access Driver (*.mdb)};DSN='';DBQ=Database.mdb"
// 建议在try块中进行数据库操作
try
{
// 打开数据库(简单用法)
// 参数1是DSN地址,这里留空
// 参数2是独占连接,默认为false
// 参数3是只读连接,默认为false
// 参数4是连接地址
// 参数5是是否使用游标库,默认为true
m_dbfile.Open(NULL, false, false, sConnect);
// 更改标题栏
SetWindowText("数据库测试:数据库已连接");
// 加载数据库内容到程序
LoadDataFromDB();
}
catch(CDBException &e) // 数据库失败时
{
AfxMessageBox("数据库连接失败,确认数据库Database.mdb是否在当前路径下!");
return;
}
}
void CDataBaseTest1Dlg::OnBnClickedDbclose()
{
if (m_dbfile.IsOpen()) { // 如果数据库已打开
m_dbfile.Close(); // 关闭数据库
SetWindowText("数据库测试:数据库已断开");
}
}
void CDataBaseTest1Dlg::OnClose()
{
if (m_dbfile.IsOpen()) {
m_dbfile.Close();
SetWindowText("数据库测试:数据库已断开");
}
CDialog::OnClose();
}
void CDataBaseTest1Dlg::SuspendDataToDB(void)
{
if (m_dbfile.IsOpen()) { // 数据库操作
try {
CString strSql;
// 删除所有记录
m_dbfile.ExecuteSQL("DELETE FROM datatable");
for (int i=0; i<m_combobox.getcount(); i++) { 依次取得组合框中的字符串 cstring temp; m_combobox.getlbtext(i, temp); 依次插入 strsql.format("insert into datatable (id, context) values (%d, '%s');", i, m_dbfile.executesql(strsql); } } catch (cdbexception &e) } } void cdatabasetest1dlg::loaddatafromdb(void) if (m_dbfile.isopen()) 数据库操作 记录集,可以方便地操作记录 crecordset的应用十分广泛,用法参见微软msdn crecordset recset(&m_dbfile); 需要一个select查询语句以打开记录集 cstring sqlstr=" "SELECT" context from order by id asc"; 打开记录集: 参数1是打开类型,有forwardonly、snapshot、dynaset、dynamic,默认为snapshot 参数2是sql语句 参数3是打开选项,这里是readonly,表示只读 recset.open(crecordset::forwardonly, sqlstr, crecordset::readonly); 先清空组合框 m_combobox.resetcontent(); while (!recset.iseof()) 通过 getfieldvalue("字段名", &str); 获取当前记录中各字段的数据 cstring recset.getfieldvalue("context", 向组合框添加所取得的值 m_combobox.addstring(temp); 移向下一条记录 recset.movenext(); }< code></m_combobox.getcount();></code>