设在OnInitDialog()函数中,已经完成了初始化COM,创建ADO连接等操作,即

  1. // 初始化COM,创建ADO连接等操作
  2. if (!AfxOleInit()) {
  3. AfxMessageBox("OLE/COM初始化失败");
  4. return FALSE;
  5. }
  6. HRESULT hr;
  7. try
  8. {
  9. //  hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  10. hr =    m_pConnection.CreateInstance(__uuidof(Connection));
  11. if(SUCCEEDED(hr))
  12. {
  13. hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test1.mdb","","",adModeUnknown);///连接
  14. //  hr = m_pConnection->Open("Provider=SQLOLEDB;server=(local);UID=sa;PWD=123;database=test1","","",adModeUnknown);
  15. }
  16. }
  17. catch(_com_error e)///捕捉异常
  18. {
  19. CString errormessage;
  20. errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
  21. AfxMessageBox(errormessage);///显示错误信息
  22. }

一、点击”读取按钮“,从数据库中读取数据,在界面上显示,有三种方法:

  1. void CMyLinkMdbDlg::OnReadAccess()
  2. {
  3. // TODO: Add your control notification handler code here
  4. /*******************以下提供了3种形式方法执行SQL命令*****************/
  5. /*  ***********第一种  用Execute 执行SQL命令**********
  6. try
  7. {
  8. m_pRecordset.CreateInstance("ADODB.Recordset");
  9. _bstr_t strCmd="SELECT * FROM [user]";
  10. m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);
  11. }
  12. catch(_com_error *e)
  13. {
  14. AfxMessageBox(e->Description());
  15. }
  16. */
  17. /************第二种   用command命令操作SQL语句************
  18. m_pCommand.CreateInstance("ADODB.Command");
  19. _variant_t vNULL;
  20. vNULL.vt = VT_ERROR;
  21. vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
  22. m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
  23. m_pCommand->CommandText = "SELECT * FROM [user]";///命令字串
  24. m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
  25. */
  26. /**************第三种   直接用open执行SQL语句 *************/
  27. m_pRecordset.CreateInstance(__uuidof(Recordset));
  28. try
  29. {
  30. m_pRecordset->CursorLocation   =   adUseClient;          //若需要排序的话必须要
  31. m_pRecordset->Open("SELECT * FROM [user1]",                // 查询DemoTable表中所有字段
  32. _variant_t((IDispatch *)m_pConnection,true),     // 获取库接库的IDispatch指针
  33. adOpenDynamic,
  34. adLockOptimistic,
  35. adCmdText);
  36. m_pRecordset->Sort   =   "id   asc";          //按照id升序排序
  37. }
  38. catch(_com_error *e)
  39. {
  40. AfxMessageBox(e->ErrorMessage());
  41. }
  42. _variant_t vID,vName,vAge;
  43. // 清空列表框
  44. m_DataList.ResetContent();
  45. m_DataList.SetCurSel(0);
  46. vName=vAge="";
  47. // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
  48. // 因为它有时会经常出现一些想不到的错误。jingzhou xu
  49. try
  50. {
  51. if(!m_pRecordset->BOF)
  52. m_pRecordset->MoveFirst();
  53. else
  54. {
  55. AfxMessageBox("表内数据为空");
  56. return;
  57. }
  58. CString strtemp;
  59. while (!m_pRecordset->adoEOF)
  60. {
  61. strtemp = "";
  62. vID=m_pRecordset->GetCollect(_variant_t((long)0));
  63. //取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行
  64. vName=m_pRecordset->GetCollect("name");
  65. vAge=m_pRecordset->GetCollect("age");
  66. if(vID.vt != VT_NULL)
  67. {
  68. strtemp.Format("%d",vID.lVal);
  69. }
  70. if(vName.vt != VT_NULL)
  71. {
  72. strtemp += "             ";
  73. strtemp += (LPCTSTR)(_bstr_t)vName;
  74. }
  75. if(vAge.vt != VT_NULL)
  76. {
  77. strtemp += "             ";
  78. strtemp += (LPCTSTR)(_bstr_t)vAge;
  79. }
  80. m_DataList.AddString(strtemp);
  81. UpdateData(FALSE);
  82. m_pRecordset->MoveNext();
  83. }
  84. m_DataList.SetCurSel(0);
  85. OnSelchangeData();
  86. }
  87. catch(_com_error *e)
  88. {
  89. AfxMessageBox(e->ErrorMessage());
  90. }
  91. m_pRecordset->Close();
  92. m_pRecordset=NULL;
  93. }

二、插入数据

  1. void CMyLinkMdbDlg::OnInsert()
  2. {
  3. // TODO: Add your control notification handler code here
  4. UpdateData(TRUE);
  5. if (m_Age == "" || m_Name == "")
  6. {
  7. AfxMessageBox("输入不能为空");
  8. return;
  9. }
  10. m_pRecordset.CreateInstance(__uuidof(Recordset));
  11. try
  12. {
  13. m_pRecordset->Open("SELECT * FROM [user1]",                // 查询DemoTable表中所有字段
  14. _variant_t((IDispatch *)m_pConnection,true),     // 获取库接库的IDispatch指针
  15. adOpenDynamic,
  16. adLockOptimistic,
  17. adCmdText);
  18. m_pRecordset->AddNew();                         //用这种方法添加数据就必须用open 语句执行SQL语句
  19. m_pRecordset->PutCollect("name", _variant_t(m_Name));
  20. m_pRecordset->PutCollect("age", atol(m_Age));
  21. m_pRecordset->Update();
  22. m_pRecordset->Close();
  23. AfxMessageBox("插入成功!");
  24. OnReadAccess();
  25. }
  26. catch(_com_error *e)
  27. {
  28. AfxMessageBox(e->ErrorMessage());
  29. }
  30. m_pRecordset=NULL;
  31. }

三、修改数据

  1. void CMyLinkMdbDlg::OnModify()
  2. {
  3. // TODO: Add your control notification handler code here
  4. int cursel = m_DataList.GetCurSel();         //得到当前所选记录的索引
  5. UpdateData(TRUE);
  6. if (m_Age == "" || m_Name == "")
  7. {
  8. AfxMessageBox("输入不能为空");
  9. return;
  10. }
  11. m_pRecordset.CreateInstance(__uuidof(Recordset));
  12. try
  13. {
  14. m_pRecordset->Open("SELECT * FROM [user1]",                // 查询DemoTable表中所有字段
  15. _variant_t((IDispatch *)m_pConnection,true),     // 获取库接库的IDispatch指针
  16. adOpenDynamic,
  17. adLockOptimistic,
  18. adCmdText);
  19. m_pRecordset->MoveFirst();
  20. m_pRecordset->Move(cursel);
  21. m_pRecordset->PutCollect("name", _variant_t(m_Name));
  22. m_pRecordset->PutCollect("age", atol(m_Age));
  23. m_pRecordset->Update();
  24. m_pRecordset->Close();
  25. OnReadAccess();                 //修改后需重新读取数据库
  26. m_DataList.SetCurSel(cursel);       //修改后指针仍旧指向刚修改的记录
  27. }
  28. catch(_com_error *e)
  29. {
  30. AfxMessageBox(e->ErrorMessage());
  31. }
  32. m_pRecordset=NULL;
  33. }

四、删除数据

  1. void CMyLinkMdbDlg::OnDelete()
  2. {
  3. // TODO: Add your control notification handler code here
  4. int cursel = m_DataList.GetCurSel();         //得到当前所选记录的索引
  5. m_pRecordset.CreateInstance(__uuidof(Recordset));
  6. try
  7. {
  8. m_pRecordset->Open("SELECT * FROM [user1]",                // 查询DemoTable表中所有字段
  9. _variant_t((IDispatch *)m_pConnection,true),     // 获取库接库的IDispatch指针
  10. adOpenDynamic,
  11. adLockOptimistic,
  12. adCmdText);
  13. m_pRecordset->MoveFirst();
  14. m_pRecordset->Move(cursel);
  15. m_pRecordset->Delete(adAffectCurrent);             //参数adAffectCurrent为删除当前记录
  16. m_pRecordset->Update();
  17. m_pRecordset->Close();
  18. OnReadAccess();                 //修改后需重新读取数据库
  19. m_DataList.SetCurSel(cursel - 1);
  20. }
  21. catch(_com_error *e)
  22. {
  23. AfxMessageBox(e->ErrorMessage());
  24. }
  25. m_pRecordset=NULL;
  26. }

以上四部分完成了数据库最常用的增、删、改、查功能~

先在程序初始化函数中完成COM的初始化和数据库的连接,再在每一个增删改查的函数中,创建记录集

  1. m_pRecordset

用m_pRecordset调用Open函数,打开数据库,获取数据记录集,

再用m_pRecordset就可以灵活调用数据库了~~

在读取数据库内容函数中:

(1)

if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();

还有

while (!m_pRecordset->adoEOF)

{

……

m_pRecordset->MoveNext();

……

}

这里就涉及到BOF和EOF的作用,其实上面的 if 和 while 的写法基本上就是固定的了,在不同的应用程序里都差不多~~

简单的说,

~使用 BOF 和 EOF(adoEOF) 属性可确定 Recordset 对象是否包含记录,或者从一个记录移动到另一个记录时是否超出 Recordset 对象的限制。
~如果当前记录位于第一个记录之前,BOF 属性将返回 True (-1),如果当前记录为第一个记录或位于其后则将返回 False (0)。 
~如果当前记录位于 Recordset 对象的最后一个记录之后 EOF(adoEOF)  属性将返回 True,而当前记录为 Recordset 对象的最后一个记录或位于其前,则将返回 False。
~如果 BOF 或 EOF (adoEOF) 属性为 True,则没有当前记录

也即是说,if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();

这里的作用就是,如果表内数据不为空,就把记录集指针移动到第一条记录(MoveFirst),(移动指针到记录集中的第一行)

现在就可以用m_pRecordset调用其他函数对数据库里的内容进行操作了~~

在while循环中,易看出,当我们读取记录集中的数据时,只要没有读到末尾,那么,一直调用m_pRecordset->MoveNext(); 让指针下移~~

(2)在”插入数据库“部分,有以下代码:

m_pRecordset->AddNew();                         //用这种方法添加数据就必须用open 语句执行SQL语句
m_pRecordset->PutCollect("name", _variant_t(m_Name));
m_pRecordset->PutCollect("age", atol(m_Age));
m_pRecordset->Update();
      m_pRecordset->Close();

AddNew 这个是让表添加一个新行
再执行下面两个Putcollect ,
put 放入的意思。这里是把m_Name值放入表中的name字段中;m_Age放入age 字段中~~
Update是更新数据记录集
Close是关闭数据记录集~
 
(3)在”修改数据“部分,有下列代码:
		m_pRecordset->MoveFirst();
m_pRecordset->Move(cursel);
m_pRecordset->PutCollect("name", _variant_t(m_Name));
m_pRecordset->PutCollect("age", atol(m_Age));
m_pRecordset->Update();
m_pRecordset->Close();
MoveFirst 移动指针到记录集的第一行(即,设置默认情况下,指针在第一行)
Move(cursel),移动到cursel行,即移动到光标指向的位置 (光标的位置要响应ListBox的单击响应函数)
由于记录集指针在光标指向的位置,所以再执行下面两个PutCollect 函数时,再往该行中写入数据,相当于把原来该行的数据覆盖了~~就能起到修改的作用~~

ADO+MFC数据库编程常用语句的更多相关文章

  1. ADO.NET数据库编程

    ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...

  2. JDBC数据库编程常用接口(转)

    JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现.这东西能够 ...

  3. Delphi使用ADO进行数据库编程

    Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...

  4. MFC 数据库编程 增删改查的一个例子

    1.先看下效果图: 主界面: 一个最简单的1对多的表,一张Article(文章)表,一张Category(类别)表.有添加,修改,删除文章按钮.点击类别编辑按钮就会跳到第二个对话框.点击数据库配置就会 ...

  5. 在Visual C++中的用ADO进行数据库编程

    1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO ...

  6. SQL Server 数据库部分常用语句小结(三)

    21.SQL运行Log的读取 .EXEC xp_readerrorlog 0,1,null,null,'开始时间','结束时间' 22. Alwayson 状况及传输情况监控 SELECT ar.re ...

  7. SQL Server 数据库部分常用语句小结(二)

    9. 查询备份还原数据库的进度. select command ,percent_complete ,est_time_to_go=convert(varchar,(estimated_complet ...

  8. SQL Server 数据库部分常用语句小结(一)

    1. 查询某存储过程的访问情况 SELECT TOP 1000 db_name(d.database_id) as DBName, s.name as 存储名字, s.type_desc as 存储类 ...

  9. VBA编程常用语句

    .Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Option Compa ...

随机推荐

  1. Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置

    问题描述:给定一个有序序列,找到指定元素的起始和结束位置.例如:1234555,5,起始4结束6 算法分析:其实就是一个二分查找的利用.但是特殊就在不是找到某个元素,而是找到下标.也就是在nums[m ...

  2. strcpy的实现

    // // Strcpy.c // libin // // Created by 李宾 on 15/8/20. // Copyright (c) 2015年 李宾. All rights reserv ...

  3. JSON01_资料

    1. 资料网址: http://blog.csdn.net/vincent_czz/article/details/7333977 http://blog.csdn.net/huangwuyi/art ...

  4. npm的镜像和淘宝互换

    1.得到原本的镜像地址 npm get registry > https://registry.npmjs.org/ 设成淘宝的 npm config set registry http://r ...

  5. tflearn kears GAN官方demo代码——本质上GAN是先训练判别模型让你能够识别噪声,然后生成模型基于噪声生成数据,目标是让判别模型出错。GAN的过程就是训练这个生成模型参数!!!

    GAN:通过 将 样本 特征 化 以后, 告诉 模型 哪些 样本 是 黑 哪些 是 白, 模型 通过 训练 后, 理解 了 黑白 样本 的 区别, 再输入 测试 样本 时, 模型 就可以 根据 以往 ...

  6. mysql 习题

    习题1 1.创建一个库(dt55_mysql),在库下创建一张students表 (1)students表中的字段有:id(int类型),stuName(varchar类型),age(int类型),w ...

  7. 【51nod-1183】编辑距离

    链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 #include <bits/stdc++.h> ...

  8. [eShopOnContainers 学习系列] - Index - 开篇索引

    [资料] 学习资料来源于 eShopOnContainers wiki 以及 微软官方微服务架构指南 [eShopOnContainers 学习系列] - 00 - 开发环境需求 [eShopOnCo ...

  9. 【python】《利用python进行数据分析》笔记

    [第三章]ipython C-a 到行首 C-e 到行尾 %timeit 测量语句时间,%time是一次,%timeit是多次. %pdb是自动调试的开关. %debug中,可以用b 12在第12行设 ...

  10. 【python】python内存管理摘要

    a = 1 id(a)  == id(1) 每次退出ipython重新进入,这个Id都会不一样 sys.getrefcount(a) 可以计数某个对象的引用次数,是原来的次数+1 垃圾回收 使用gc包 ...