附上重要的程序源代码:
stdafx.h文件:
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>
200字以内,仅用于支线交流,主线讨论请采用回复功能。