本文为数据库编程入门培训的第二讲,主要讲述一下数据库编程具体怎么实现。示例代码在本文后面的附件中可以下载。
如上篇文章所描述的那样,由于Microsoft Access数据库比较直观,适合初学者入门学习,故我在此依然以Access为例,示范如何对数据库进行编程练习; 而且,我使用的编程示例是基于Microsoft公司提供的Dao技术,虽然该技术已经早已过时,但是由于它的编程简单、明晰,很适合初学者,故依然在此使用Dao技术做数据库编程的示范,希望数据库编程高手们能够理解。
回顾上篇文章描述的,我们对数据库的操作主要分为以下几个方面:
1. 初始化/逆初始化数据库引擎 (操作数据库引擎)
2. 创建/打开/关闭数据库 (操作数据库文件)
3. 查找/打开/新增/删除一个数据表 (操作数据库的表)
4. 为一个新数据表添加字段,删除字段,修改字段属性 (操作数据库的字段)
5. 添加/删除/修改一条记录 (操作记录集)
6. 根据条件检索出满足条件的记录集 (查询和检索)
7. 其他:移动到下一条记录,获取表的总个数,获取记录的总数……
因此,我将通过示例代码来实现上述的某些基本功能,具体的各个类各个函数的用法,大家可以自己查看MSDN,里面都有非常详细的说明。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#include <afxdao.h>
-
#include <iostream>
-
-
-
-
-
-
#pragma warning(disable : 4995)
-
-
-
-
-
-
-
int _tmain(int argc, _TCHAR* argv[])
- {
-
- CDaoDatabase m_db;
-
-
-
- CDaoTableDef m_tableDef(&m_db);
-
-
- CDaoRecordset rs(&m_db);
-
-
- AfxDaoInit();
-
-
- TRY
- {
-
m_db.Create(_T("D:\\user.mdb"),dbLangGeneral,dbVersion30);
- }
- CATCH(CDaoException, e)
- {
- // 通过这条语句可以将错误描述字符串存储到szError中
CString szError = e->m_pErrorInfo-> m_strDescription;
-
std::cout << "error occur !" <<std::endl;
-
return 0;
- }
- END_CATCH
-
-
-
if (!m_db.IsOpen())
- {
- TRY
- {
-
-
m_db.Open(_T("D:\\user.mdb"), TRUE, FALSE, _T(""));
- }
- CATCH(CDaoException, e)
- {
-
std::cout << "error occur !" <<std::endl;
-
return 0;
- }
- END_CATCH
- }
-
-
- TRY
- {
-
m_tableDef.Create(_T("登录信息表"));
- }
- CATCH(CDaoException, e)
- {
-
std::cout << "error occur !" <<std::endl;
-
return 0;
- }
- END_CATCH
-
-
- TRY
- {
-
-
m_tableDef.CreateField(_T("学号"),dbText,200,dbVariableField|dbUpdatableField);
-
-
m_tableDef.CreateField(_T("密码"),dbText,200,dbVariableField|dbUpdatableField);
-
-
m_tableDef.CreateField(_T("年龄"),dbLong,200,dbVariableField|dbUpdatableField);
-
-
- m_tableDef.Append();
- }
- CATCH(CDaoException, e)
- {
-
std::cout << "error occur !" <<std::endl;
-
return 0;
- }
- END_CATCH
-
-
- TRY
- {
-
- rs.Open(&m_tableDef);
-
-
-
if (!rs.IsEOF())
- {
- rs.MoveLast();
- }
-
-
- rs.AddNew();
-
-
rs.SetFieldValue(_T("学号"),_T("012006011208"));
-
-
rs.SetFieldValue(_T("密码"),_T("123456"));
-
-
rs.SetFieldValue(_T("年龄"),_T("18"));
-
- rs.Update();
-
-
- rs.Close();
- }
- CATCH(CDaoException, e)
- {
-
std::cout << "error occur !" <<std::endl;
-
return 0;
- }
- END_CATCH
-
-
- TRY
- {
-
- rs.Open(&m_tableDef);
-
-
- rs.MoveFirst();
-
- COleVariant coleUserNo;
- COleVariant colePassword;
- COleVariant coleAge;
-
-
-
rs.GetFieldValue(_T("学号"), coleUserNo);
-
rs.GetFieldValue(_T("密码"), colePassword);
-
rs.GetFieldValue(_T("年龄"), coleAge);
-
-
-
LONG age = coleAge.lVal;
-
-
- CString szUserNo = V_BSTR(&coleUserNo);
- CString szPassword = V_BSTR(&colePassword);
-
-
- rs.Close();
-
- }
- CATCH(CDaoException, e)
- {
-
std::cout << "error occur !" <<std::endl;
-
return 0;
- }
- END_CATCH
-
-
- TRY
- {
-
if (m_db.IsOpen())
- {
- m_db.Close();
- }
- }
- CATCH(CDaoException, e)
- {
-
std::cout << "error occur !" <<std::endl;
- }
- END_CATCH
-
-
- AfxDaoTerm();
-
-
std::cout << " 数据库文件已经输出到D://user.mdb" << std::endl;
-
-
int temp;
- std::cin >> temp;
-
-
return 1;
- }
希望大家仔细阅读上述代码,并通过MSDN的帮助,真正对数据库编程有一个直观的认识,以后进行其他类型的数据库编程就可以很快地上手了。
为了检验大家是否真正了解和掌握了数据库编程,下面我出一道题目,希望大家依靠自己的能力把它实现,权当练习练习。
题目:简单的登陆系统
提供简单的注册功能,注册信息包括:
用户名(不允许重复),登录密码,性别,年龄
使用Access数据库存储上述信息
程序提供如下功能:
1. 启动程序后,自动创建数据库文件、用户信息表、相应的字段
2. 能够删除数据表,然后重建数据表
3. 能够新增一条用户记录
4. 能够显示数据库中的全部用户名
5. 能够显示指定用户名的个人信息
6. 能够删除指定用户名的记录
7. 能够修改指定用户名的用户的年龄
8. 能够查询显示“年龄>18岁”的所有用户名
本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/315190,如需转载请自行联系原作者