• VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法


    1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用 #import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现:
    1. #import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF", "adoEOF")   
    【注意,在MFC中路径要用"/"或者"//"】
    其中路径名可以根据自己系统安装的ADO支持文件的路径来自 行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数 LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现 文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明 ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
        2.其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下 面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始 化COM和结束时关闭COM的操作,语句如下所示:
    1. AfxOleInit();   

        3.接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它 们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:
    _ConnectionPtr接 口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用 _ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
        _CommandPtr接 口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但 如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr 接口执行存储过程和SQL语句。
        _RecordsetPtr是一 个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已 经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用 已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

    特别声明:如果是MFC程序,则初始化ado组件就不需要用CoInitialize(NULL), 只需要在**App::InitInstance()函数中调用AfxOleInit();即可:例如:

    1. BOOL CMyAdoTestApp::InitInstance()  
    2. {  
    3. if(!AfxOleInit())//这就是初始化COM库  
    4. {  
    5. AfxMessageBox(“OLE初始化出错!”);  
    6. return FALSE;  
    7. }  

    创建一个对话框程序。新建一个名为ADOConn的类,在头文件中导入msado15.dll

    语句如下:

    1. #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace  
    2.   
    3. rename("EOF","adoEOF")rename("BOF","adoBOF")  

    这句话主要作用是引入ADO类库。

    1:在ADOConn.h头文件中为类添加变量和初始化函数

    1. //添加一个指向Connection的指针  
    2.   
    3.    _ConnectionPtr m_pConnection;  
    4.   
    5. //添加一个指向Recordset对象的指针  
    6.   
    7. _RecordsetPtr m_pRecordset;  
    8.   
    9. void ADOConn::OnInitADOConn()  
    10.   
    11. {  
    12.   
    13. //初始化OLE/COM库环境  
    14.   
    15.      ::CoInitialize(NULL);  
    16.   
    17. try  
    18.   
    19. {  
    20.   
    21. //´创建connection连接对象  
    22.   
    23.         m_pConnection.CreateInstance("ADODB.Connection");     
    24.   
    25.     //设置连接字符串  
    26.   
    27.     _bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security  
    28.   
    29.   
    30. Info=False;Initial Catalog=data;Data Source=.";  
    31.   
    32.     //SERVER和UID,PWD的设定需要根据自己的情况  
    33.   
    34.     m_pConnection->Open(strConnect,"","",adModeUnknown);  
    35.   
    36. }  
    37.   
    38. //捕捉异常  
    39.   
    40. catch(_com_error e)  
    41.   
    42. {  
    43.   
    44. //显示错误信息  
    45.   
    46. AfxMessageBox(e.Description());  
    47.   
    48. }  
    49.   
    50. }  

    2:为ADOConn类添加GetRecordSet的函数,目的是打开并获得记录集,代码如下:

    1. _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)  
    2.   
    3. {  
    4.   
    5.      try  
    6.   
    7. {  
    8.   
    9. //连接数据库,如果connection为空则重新连接  
    10.   
    11. if(m_pConnection==NULL)  
    12.   
    13.                OnInitADOConn();  
    14.   
    15. //创建记录集对象  
    16.   
    17. m_pRecordset.CreateInstance(__uuidof(Recordset));  
    18.   
    19. //取得表中的记录  
    20.   
    21.          m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),  
    22.   
    23. adOpenDynamic,adLockOptimistic,adCmdText);  
    24.   
    25. }  
    26.   
    27.      catch(_com_error e)  
    28.   
    29. {  
    30.   
    31. e.Description();  
    32.   
    33. }  
    34.   
    35. //返回记录集  
    36.   
    37. return m_pRecordset;  
    38.   
    39. }  

    3:在ADOConn类中添加ExecteSQL函数,目的是用来执行SQL语句,代码如下:

    1. BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)  
    2.   
    3. {  
    4.   
    5. _variant_t RecordsAffected;  
    6.   
    7. try  
    8.   
    9. {  
    10.   
    11. //是否连接上数据库  
    12.   
    13.          if(m_pConnection==NULL)  
    14.   
    15.       OnInitADOConn();  
    16.   
    17.          m_pConnection->Execute(bstrSQL,NULL,adCmdText);//adCmdText文本命令  
    18.   
    19. return true;  
    20.   
    21. }  
    22.   
    23. catch(_com_error e)  
    24.   
    25. {  
    26.   
    27. e.Description();  
    28.   
    29. return false;  
    30.   
    31. }  
    32.   
    33. }  

    4:设置退出记录集类

    1. void ADOConn::ExitConnect()  
    2.   
    3. {  
    4.   
    5. //关闭记录集和连接  
    6.   
    7.      if(m_pRecordset!=NULL)  
    8.   
    9. m_pRecordset->Close();  
    10.   
    11. m_pConnection->Close();  
    12.   
    13.   
    14. }  

    5:为对话框添加一个ListControl控件按钮,并设置属性为Report

    为ListControl控件关联一个对象CListCtrl m_grid;

    在初始化对话框函数里面添加

    1. //设置ListControl控件的风格  
    2.   
    3. m_grid.SetExtendedStyle(LVS_EX_FLATSB  
    4.   
    5. |LVS_EX_FULLROWSELECT  
    6.   
    7. |LVS_EX_HEADERDRAGDROP  
    8.   
    9. |LVS_EX_ONECLICKACTIVATE  
    10.   
    11. |LVS_EX_GRIDLINES);  
    12.   
    13. m_grid.InsertColumn(0,"编号",LVCFMT_LEFT,100,0);  
    14.   
    15. m_grid.InsertColumn(1,"姓名",LVCFMT_LEFT,100,1);  
    16.   
    17. m_grid.InsertColumn(2,"性别",LVCFMT_LEFT,100,2);  
    18.   
    19. ADOConn m_AdoConn;  
    20.   
    21. m_AdoConn.OnInitADOConn();  
    22.   
    23. CString sql;  
    24.   
    25. sql.Format("select* from employees order by 编号 desc");  
    26.   
    27. _RecordsetPtr m_pRecordset;  
    28.   
    29. m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);  
    30.   
    31. while(m_AdoConn.m_pRecordset->adoEOF==0)//EOF判断是否到末尾  
    32.   
    33. {  
    34.   
    35. m_grid.InsertItem(0,"");  
    36.   
    37. m_grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("编号"));  
    38.   
    39. m_grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));  
    40.   
    41. m_grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("性别"));  
    42.   
    43. m_pRecordset->MoveNext();  
    44.   
    45. }  
    46.   
    47. m_AdoConn.ExitConnect();//断开数据库连接  

    6:添加数据.

    在对话框添加两个EditBox控件和一个Combox控件和一个按钮控件

    如下图:


    关联对象如下

    1. CString m_id,m_name;CComboBox m_combo;  
    2.   
    3. //在初始化中添加  
    4.   
    5. m_combo.InsertString(0,"男");  
    6.   
    7. m_combo.InsertString(1,"女");  
    8.   
    9. m_combo.SetCurSel(0);  
    10.   
    11. //按钮响应事件:  
    12.   
    13. UpdateData(true);  
    14.   
    15. if(m_id.IsEmpty())  
    16.   
    17. {  
    18.   
    19. MessageBox("编号不能为空");  
    20.   
    21. return;  
    22.   
    23. }  
    24.   
    25. if(m_name.IsEmpty())  
    26.   
    27. {  
    28.   
    29. MessageBox("姓名不能为空");  
    30.   
    31. return;  
    32.   
    33. }  
    34.   
    35. ADOConn m_AdoConn;  
    36.   
    37. m_AdoConn.OnInitADOConn();  
    38.   
    39. _bstr_t sql;  
    40.   
    41. sql = "select*from employees";  
    42.   
    43. _RecordsetPtr m_pRecordset;  
    44.   
    45.      m_pRecordset=m_AdoConn.GetRecordSet(sql);  
    46.   
    47. CString sex;  
    48.   
    49. m_combo.GetLBText(m_combo.GetCurSel(),sex);  
    50.   
    51. try  
    52.   
    53. {  
    54.   
    55. m_pRecordset->AddNew();//添加新行  
    56.   
    57. m_pRecordset->PutCollect("编号",(_bstr_t)m_id);  
    58.   
    59. m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);  
    60.   
    61. m_pRecordset->PutCollect("性别",(_bstr_t)sex);  
    62.   
    63. m_AdoConn.ExitConnect();  
    64.   
    65. }  
    66.   
    67. catch(...)  
    68.   
    69. {  
    70.   
    71. MessageBox("操作失败");  
    72.   
    73. return;  
    74.   
    75. }  
    76.   
    77. MessageBox("保存成功");  
    78.   
    79. m_grid.DeleteAllItems();  
    80.   
    81. AddToGrid();//这个是用来显示数据的,就是第八步初始化中的代码  

    7 修改记录集

    在添加一个EditBox控件,关联对象CString m_old;用来保存,修改之前的编号;

    添加修改按钮,并响应事件,代码如下:

    1. UpdateData(true);  
    2.   
    3. if(m_name.IsEmpty())  
    4.   
    5. {  
    6.   
    7. MessageBox("姓名不能为空");  
    8.   
    9. return;  
    10.   
    11. }  
    12.   
    13. ADOConn m_AdoConn;  
    14.   
    15. m_AdoConn.OnInitADOConn();  
    16.   
    17. _bstr_t sql;  
    18.   
    19. sql = "select*from employees";  
    20.   
    21. _RecordsetPtr m_pRecordset;  
    22.   
    23.      m_pRecordset=m_AdoConn.GetRecordSet(sql);  
    24.   
    25. CString sex;  
    26.   
    27. m_combo.GetLBText(m_combo.GetCurSel(),sex);  
    28.   
    29. try  
    30.   
    31. {  
    32.   
    33. m_pRecordset->Move((long)pos,vtMissing);  
    34.   
    35. m_pRecordset->PutCollect("编号",(_bstr_t)m_id);  
    36.   
    37. m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);  
    38.   
    39. m_pRecordset->PutCollect("性别",(_bstr_t)sex);  
    40.   
    41. m_pRecordset->Update();  
    42.   
    43. m_AdoConn.ExitConnect();  
    44.   
    45. }  
    46.   
    47. catch(...)  
    48.   
    49. {  
    50.   
    51. MessageBox("操作失败");  
    52.   
    53. return;  
    54.   
    55. }  
    56.   
    57. MessageBox("操作成功");  
    58.   
    59. m_grid.DeleteAllItems();  
    60.   
    61. AddToGrid();  
    62.   
    63. 8:删除记录集  
    64.   
    65. UpdateData(true);  
    66.   
    67. ADOConn m_AdoConn;  
    68.   
    69. m_AdoConn.OnInitADOConn();  
    70.   
    71. _bstr_t sql;  
    72.   
    73. sql = "select*from employees";  
    74.   
    75. _RecordsetPtr m_pRecordset;  
    76.   
    77.      m_pRecordset=m_AdoConn.GetRecordSet(sql);  
    78.   
    79. CString m_id;  
    80.   
    81. try  
    82.   
    83. {  
    84.   
    85. m_pRecordset->Move(pos,vtMissing);  
    86.   
    87. m_pRecordset->Delete(adAffectCurrent);  
    88.   
    89. m_pRecordset->Update();  
    90.   
    91. m_AdoConn.ExitConnect();  
    92.   
    93. }  
    94.   
    95. catch(...)  
    96.   
    97. {  
    98.   
    99. MessageBox("操作失败");  
    100.   
    101. return;  
    102.   
    103. }  
    104.   
    105. MessageBox("删除成功.");  
    106.   
    107. m_grid.DeleteAllItems();  
    108.   
    109. AddToGrid();  

    以上总结了,SQL连接四种基本操作

  • 相关阅读:
    技术文档生成工具:appledoc
    Runtime之方法
    swift开发新项目总结
    iOS调试通过UILocalNotification或RemoteNotification启动的app
    github源码学习之UIImage+YYWebImage
    用NSAttributedString实现简单的图文混排
    用block做事件回调来简化代码,提高开发效率
    用drawRect的方式实现一个尺子
    Xcode自定义代码块
    简单的数据库设计及使用(FMDB)
  • 原文地址:https://www.cnblogs.com/guozengxin/p/3541263.html
Copyright © 2020-2023  润新知