数据库编程入门培训(二)

本文为数据库编程入门培训的第二讲,主要讲述一下数据库编程具体怎么实现。示例代码在本文后面的附件中可以下载。

      如上篇文章所描述的那样,由于Microsoft Access数据库比较直观,适合初学者入门学习,故我在此依然以Access为例,示范如何对数据库进行编程练习; 而且,我使用的编程示例是基于Microsoft公司提供的Dao技术,虽然该技术已经早已过时,但是由于它的编程简单、明晰,很适合初学者,故依然在此使用Dao技术做数据库编程的示范,希望数据库编程高手们能够理解。

       回顾上篇文章描述的,我们对数据库的操作主要分为以下几个方面:

          1. 初始化/逆初始化数据库引擎 (操作数据库引擎)
          2. 创建/打开/关闭数据库 (操作数据库文件)
          3. 查找/打开/新增/删除一个数据表 (操作数据库的表)
          4. 为一个新数据表添加字段,删除字段,修改字段属性 (操作数据库的字段)
          5. 添加/删除/修改一条记录 (操作记录集)
          6. 根据条件检索出满足条件的记录集 (查询和检索)
          7. 其他:移动到下一条记录,获取表的总个数,获取记录的总数……

       因此,我将通过示例代码来实现上述的某些基本功能,具体的各个类各个函数的用法,大家可以自己查看MSDN,里面都有非常详细的说明。


  1. //////////////////////////////////////////////////////////////////////////  
  2. /// COPYRIGHT NOTICE  
  3. /// Copyright (c) 2009, 华中科技大学tickTick Group  (版权声明)  
  4. /// All rights reserved.  
  5. ///   
  6. /// @file    testDB.cpp    
  7. /// @brief   数据库测试文件  
  8. ///  
  9. /// 本文件示范了Dao数据库访问方法  
  10. ///  
  11. /// @version 1.0     
  12. /// @author  卢俊   
  13. /// @date    2010/05/10  
  14. ///  
  15. ///  
  16. ///  修订说明:  
  17. //////////////////////////////////////////////////////////////////////////  
  18.  
  19. // 需要使用Dao技术访问数据库,必须包含afxdao.h  
  20. #include <afxdao.h>  
  21. #include <iostream>  
  22.  
  23. // 因为DAO技术现在微软已经不在做技术支持了,  
  24. // 说在未来版本中可能不再支持此,所以会有警告,  
  25. // 但因为其简单,易于初学者学习,故在此我依然拿它做例子  
  26. // 这里,disabled掉这个警告。  
  27. #pragma warning(disable : 4995)  
  28.  
  29. // 工程配置注意事项  
  30. // 由于CDaoDatabase是派生于MFC的CObject类,故工程中需要加入MFC共享库的支持  
  31. // 具体配置方法,修改VS2008左侧的工程名称上右键->属性(properties)->常规(general)->使用MFC(use of mfc)  
  32. // 选择Use MFC in a Shared DL  
  33.  
  34. int _tmain(int argc, _TCHAR* argv[])  
  35. {  
  36.     // 数据库操作类  
  37.     CDaoDatabase m_db;      
  38.  
  39.     // 数据库用户信息表操作对象  
  40.     // MSDN上有说明,该类对象创建时需要绑定表所依附的数据库对象  
  41.     CDaoTableDef m_tableDef(&m_db);  
  42.  
  43.     // 创建记录集对象  
  44.     CDaoRecordset rs(&m_db);  
  45.  
  46.     // DAO引擎初始化  
  47.     AfxDaoInit();  
  48.  
  49.     //创建无密码的数据库  
  50.     TRY  
  51.     {  
  52.         m_db.Create(_T("D:\\user.mdb"),dbLangGeneral,dbVersion30);      
  53.     }  
  54.     CATCH(CDaoException, e)  
  55.     {  
  56. // 通过这条语句可以将错误描述字符串存储到szError中
       CString szError = e->m_pErrorInfo-> m_strDescription;
  57.         std::cout << "error occur !" <<std::endl;  
  58.         return 0;  
  59.     }  
  60.     END_CATCH  
  61.  
  62.     // 打开数据库  
  63.     if (!m_db.IsOpen())  
  64.     {  
  65.         TRY  
  66.         {  
  67.             // 参数1:数据库全路径,参数2:是否独占,参数3:是否只读模式,参数4:密码  
  68.             m_db.Open(_T("D:\\user.mdb"), TRUE, FALSE, _T(""));  
  69.         }  
  70.         CATCH(CDaoException, e)  
  71.         {  
  72.             std::cout << "error occur !" <<std::endl;  
  73.             return 0;  
  74.         }  
  75.         END_CATCH  
  76.     }  
  77.  
  78.     // 创建表  
  79.     TRY  
  80.     {  
  81.         m_tableDef.Create(_T("登录信息表"));  
  82.     }  
  83.     CATCH(CDaoException, e)  
  84.     {  
  85.         std::cout << "error occur !" <<std::endl;  
  86.         return 0;  
  87.     }  
  88.     END_CATCH  
  89.  
  90.     // 创建字段  
  91.     TRY  
  92.     {  
  93.         // 学号  
  94.         m_tableDef.CreateField(_T("学号"),dbText,200,dbVariableField|dbUpdatableField);  
  95.         // 密码  
  96.         m_tableDef.CreateField(_T("密码"),dbText,200,dbVariableField|dbUpdatableField);  
  97.         // 年龄  
  98.         m_tableDef.CreateField(_T("年龄"),dbLong,200,dbVariableField|dbUpdatableField);  
  99.  
  100.         // 添加到数据库中  
  101.         m_tableDef.Append();  
  102.     }  
  103.     CATCH(CDaoException, e)  
  104.     {  
  105.         std::cout << "error occur !" <<std::endl;  
  106.         return 0;  
  107.     }  
  108.     END_CATCH  
  109.  
  110.     // 添加一条新的记录  
  111.     TRY    
  112.     {    
  113.         // 打开记录集  
  114.         rs.Open(&m_tableDef);  
  115.  
  116.         // 移动到记录集的尾部  
  117.         if (!rs.IsEOF())  
  118.         {  
  119.             rs.MoveLast();  
  120.         }  
  121.  
  122.         // 准备添加一条新的记录   
  123.         rs.AddNew();    
  124.         // 学号  
  125.         rs.SetFieldValue(_T("学号"),_T("012006011208"));  
  126.         // 密码  
  127.         rs.SetFieldValue(_T("密码"),_T("123456"));  
  128.         // 年龄  
  129.         rs.SetFieldValue(_T("年龄"),_T("18"));  
  130.         // 执行添加操作到数据库  
  131.         rs.Update();    
  132.  
  133.         // 关闭记录集  
  134.         rs.Close();  
  135.     }  
  136.     CATCH(CDaoException, e)  
  137.     {  
  138.         std::cout << "error occur !" <<std::endl;  
  139.         return 0;  
  140.     }  
  141.     END_CATCH  
  142.  
  143.     // 获取用户记录  
  144.     TRY    
  145.     {  
  146.         // 打开记录集  
  147.         rs.Open(&m_tableDef);  
  148.  
  149.         // 移动到第一条记录  
  150.         rs.MoveFirst();  
  151.  
  152.         COleVariant coleUserNo;  
  153.         COleVariant colePassword;  
  154.         COleVariant coleAge;  
  155.  
  156.         // 获取值  
  157.         rs.GetFieldValue(_T("学号"), coleUserNo);  
  158.         rs.GetFieldValue(_T("密码"), colePassword);  
  159.         rs.GetFieldValue(_T("年龄"), coleAge);  
  160.  
  161.         // 提取出整型数   
  162.         LONG age = coleAge.lVal;  
  163.  
  164.         // 提取字符串数据  
  165.         CString szUserNo = V_BSTR(&coleUserNo);   
  166.         CString szPassword = V_BSTR(&colePassword);  
  167.  
  168.         // 关闭记录集  
  169.         rs.Close();  
  170.  
  171.     }  
  172.     CATCH(CDaoException, e)  
  173.     {  
  174.         std::cout << "error occur !" <<std::endl;  
  175.         return 0;  
  176.     }  
  177.     END_CATCH  
  178.           
  179.     // 关闭数据库  
  180.     TRY  
  181.     {  
  182.         if (m_db.IsOpen())  
  183.         {  
  184.             m_db.Close();  
  185.         }  
  186.     }  
  187.     CATCH(CDaoException, e)  
  188.     {  
  189.         std::cout << "error occur !" <<std::endl;  
  190.     }  
  191.     END_CATCH  
  192.  
  193.     // DAO引擎注销  
  194.     AfxDaoTerm();  
  195.  
  196.     std::cout << " 数据库文件已经输出到D://user.mdb" << std::endl;  
  197.       
  198.     int temp;  
  199.     std::cin >> temp;  
  200.  
  201.     return 1;  
  202. }  

      希望大家仔细阅读上述代码,并通过MSDN的帮助,真正对数据库编程有一个直观的认识,以后进行其他类型的数据库编程就可以很快地上手了。

      为了检验大家是否真正了解和掌握了数据库编程,下面我出一道题目,希望大家依靠自己的能力把它实现,权当练习练习。

题目:简单的登陆系统

提供简单的注册功能,注册信息包括:

用户名(不允许重复),登录密码,性别,年龄

使用Access数据库存储上述信息

程序提供如下功能:
1. 启动程序后,自动创建数据库文件、用户信息表、相应的字段
2. 能够删除数据表,然后重建数据表
3. 能够新增一条用户记录
4. 能够显示数据库中的全部用户名
5. 能够显示指定用户名的个人信息
6. 能够删除指定用户名的记录
7. 能够修改指定用户名的用户的年龄
8. 能够查询显示“年龄>18岁”的所有用户名

 



本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/315190,如需转载请自行联系原作者

上一篇:二、数据库的基本操作


下一篇:吹响代码优化人才集结号