设在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. Java基本数据类型与相应的封装类

    基本数据类型   封装类 int Integer short   Short float   Float double   Double long   Long boolean   Boolean b ...

  2. 比较好的SQL语句

    批次导数据表头 SELECT [运单号] , [运单号] AS [订单号] , [运单号] AS [订单号] , [运单号] , SUM([price] * [ProductNum]) AS [订单总 ...

  3. Java中的equals学习小结

    Java中的equals是十分重要的,和= =要区别开来,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式    public  boolean equals ...

  4. 英语发音规则---A字母

    英语发音规则---A字母 一.总结 一句话总结:本文所有//的音标为英音音标,[]的音标为美音音标 1.A在开音节中发/eɪ/ [e]? age /eɪdʒ/ [edʒ] 年龄 ape /eɪp/ [ ...

  5. python中zip()函数的用法

    一. 定义 zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少内存 如果各个迭代器的元素个数不一致,则返回列表长度与最 ...

  6. jQ通过cookie记住用户名

    总结要点: 一.封装的一个cookie函数: 二.获取input的value值:$("input[name=user]").val() 三.设置input的value值:$(&qu ...

  7. Oracle归档模式与非归档模式设置

    (转自:http://www.cnblogs.com/spatial/archive/2009/08/01/1536429.html) Oracle的日志归档模式可以有效的防止instance和dis ...

  8. c#的DateTime.Now详解

    (转自:http://www.cnblogs.com/lida/archive/2011/01/02/1924197.html) //2008年4月24日 System.DateTime.Now.To ...

  9. LeetCode OJ:Palindrome Linked List(回文链表判断)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  10. 【Codeforces】894D. Ralph And His Tour in Binary Country 思维+二分

    题意 给定一棵$n$个节点完全二叉树,$m$次询问,每次询问从$a$节点到其它所有节点(包括自身)的距离$L$与给定$H_a$之差$H_a-L$大于$0$的值之和 对整棵树从叶子节点到父节点从上往下预 ...