• 用ADO封装类的数据库程序开发实例(2)


    转至连接

          接下来让我们在此基础上进行具体的编程。
      
      五、开始编写ADO应用程序.
      
      使用ADO之前,我们另外还需要添加下面的语句,如此把ADO的库引入到工程中. #import \"c:\\program files\\common files\\system\\ado\\msado15.dll\"
      no_namespace rename(\"EOF\",\"adoEOF\")
      根据机器安装时候的设置不同具体的路径可能不一样。
      另外编译的时候会出现如下的警告信息:
      msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
      MSDN建议我们不要理会。如果你实在不想看到的话可以在stdafx.h中加入一行下面的代码:
      #pragma warning(disable:4146)
      这样这个警告信息就不会再出现了。
      
      ADO使用了COM,所以在使用ADO之前,必须对COM进行了初始化,否则无法使用.你可以使用AfxOleInit()来初始化,但只能初始一次,你不能多次调用此函数,建议你在应用程序的APP类的InitInstance方法中进行初始化.
      上面这些一般相关的资料都有详细说明,因此我就不细说了,下面我们来看看如何我封装的两个类。
      
      六、ADO封装类:CAdoConnection 和 CAdoRecordSet
      
      首先当然是要连接到数据源了,连接到数据源的函数是_CAdoConnection的Connect方法,它封装了ADO连接对象的CreateInstance和Open方法:
      我们来看看我是如何封装的:
      
      BOOL CAdoConnection::Connect(LPCTSTR strConnect, long lOptions)
      {
      m_strConnect = strConnect;
      try
      {
      ///创建 Connection 对象---------------------------
      HRESULThr = m_pConnection.CreateInstance(\"ADODB.Connection\");
      if (SUCCEEDED(hr))
      {
      // 连接数据库---------------------------------------------
      if (SUCCEEDED(m_pConnection->Open(strConnect, \"\", \"\", lOptions)))
      {
      return TRUE;
      }
      }
      }
      catch (_com_error e)
      {
      TRACE(_T(\":( 连接数据库发生错误: %s\\n\"), e.ErrorMessage());
      return FALSE;
      }
      catch (...)
      {
      TRACE(_T(\":( 连接数据库时发生未知错误:\"));
      }
      return FALSE;
      }
      
      使用之前先定义一个CAdoConnection 类对象如m_adoConnection,例如:CString strSrcName = \"E:\\\\Access\\\\datebase.mdb\";//假设在e盘有这样一个access的数据库文件
      CString strConnect = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + strSrcName;
      m_adoConnection.Connect(LPCSTR(strConnect));
      
      这样就连接到数据源了.
      接着就是要打开记录集了,下面我对它的open方法的封装:使用进你可以忽略后面的三个参数,直接把一个SQL语句传给它.
      
      
      HRESULT CAdoRecordSet::Open(LPCTSTR strSQL, [Page]
      long lOption,
      CursorTypeEnum CursorType,
      LockTypeEnum LockType)
      {
      try
      {
      if (m_pConnection == NULL)
      {
      return -1;
      }
      else if (m_pRecordset == NULL)
      {
      m_pRecordset.CreateInstance(\"ADODB.Recordset\");
      }
      
      m_pRecordset->Open(_bstr_t(strSQL),
      _variant_t((IDispatch*)m_pConnection->GetConnection(), true),
      CursorType, LockType, lOption);
      if (m_pRecordset == NULL)
      {
      return -1;
      }
      return (m_pRecordset->adoEOF) ? 0 : 1;
      }
      catch (_com_error e)
      {
      TRACE(_T(\":( 打开记录集发生错误: %s\\n\"), e.ErrorMessage());
      return -1;
      }
      }
      例如我们可以这样来用:CAdoRecordSet rset;
      rset.SetAdoConnection(&(GetDocument()->m_adoConnection));//记得要先指定相应的连接对象,否则会出错.
      m_strSQL = \"select * from city\";//要执行的SQL语句.
      rset.Open(m_strSQL);
      
      七.写一个数据查询工具(我对实现过程只稍作了介绍,具体内容请参考源代码):
      
      7.1 连接数据库
      
      首先要编写连接到数据库的代码,为此,我写了一个对话框类(CLogoDig)用来选择不同的数据源,
      然后在视图类(这个视图类是从CFromView类派生的)添加 CAdoConnection 类成员变量,并添加如下连接函数 void CAccessView::OnFileConnect()
      {
      CLogoDig dlg;
      if (dlg.DoModal() == IDOK)
      {
      if (dlg.m_nSrcType == 0)
      {
      CString strConnect = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\" + dlg.m_strSrcName;
      GetDocument()->m_adoConnection.Disconnect();
      if (!GetDocument()->m_adoConnection.Connect(LPCSTR(strConnect)))
      {
      AfxMessageBox(\"连接数据库失败!\");
      return;
      }
      }
      else if (dlg.m_nSrcType == 1)
      {
      CString strConnect = \"Provider=SQLOLEDB.1;Data Source=\" + dlg.m_strSrcName +


      \";Initial Catalog=\" + dlg.m_strDbName +
      \";User ID=\" + dlg.m_strUserName + \"; PWD=\" + dlg.m_strPassWord;
      GetDocument()->m_adoConnection.Disconnect();
      if (!GetDocument()->m_adoConnection.Connect(LPCSTR(strConnect)))
      {
      AfxMessageBox(\"连接数据库失败!\");
      return;
      }
      }
      ((CMainFrame*)GetParentFrame())->m_wndLeftBar.InitTree();
      }
      }
      
      7.2 CCoolControlBar类和CMSFlexGrid类 [Page]
      
      在这个数据查询工具中我们使用了另外两个类:CCoolControlBar类和CMSFlexGrid类。.前者是我写的一个可以动态改变大小的控制条类,后者是系统自带一个网格控件,这个控件功能较少,但对于只用来显示一下查询结果已经够用了。
      在编辑CFromView类对话框资源视图中,在正在编辑的对话框资源上点右键,选择插入ActiveX控件,然后选择\"Microsoft FlexGrid control\"控件。然后在类向导中在\"Member Variables\"页中为它添加变量,类向导会提示要引入向个头文件,确认,这时你的类视图中就会增加好几个类。
      先介绍一个要用到的几个函数:
      SetCols 设置总共拥有的列数
      SetFixedCols 设置固定的列数,即背景为灰色的那种
      SetRows 设置总共拥有的行数
      SetCol 设置当前列
      SetRow 设置当前行
      SetText 设置当前格的文本。位置由上面两个函数决定。
      SetColWidth 设置列宽
      
      7.3 数据的显示与处理
      
      另外我们还需要两个编辑控件,用来输入SQL语句和显示错误信息.并在OnSize消息处理函数中动态设置它们的位置: void CAccessView::OnSize(UINT nType, int cx, int cy)
      {
      CFormView::OnSize(nType, cx, cy);
      
      if (m_wndGrid.GetSafeHwnd() != NULL) //控件是否已经创建
      {
      m_editError.MoveWindow(0, 10, cx, cy - 50);
      m_wndGrid.MoveWindow(0, 0, cx, cy - 40);
      m_editSQL.MoveWindow(0, cy - 40, cx, 40);
      }
      }
      
      添加一条菜单项并添加相应响应函数,用于开始执行输入的SQL语句:void CAccessView::OnRun()
      {
      UpdateData();
      UpdateGrid();
      }
      
      根据查询情况显示查询结果:void CAccessView::UpdateGrid()
      {
      //连接对象是否打开------------------------------------------
      if (!GetDocument()->m_adoConnection.IsOpen())
      {
      AfxMessageBox(\"数据库没有打开或已经关闭!\");
      return;
      }
      //先隐藏这两个控件------------------------------------------
      m_wndGrid.ShowWindow(SW_HIDE);
      m_editError.ShowWindow(SW_HIDE);
      
      CAdoRecordSet rset;
      rset.SetAdoConnection(&(GetDocument()->m_adoConnection));
      if (rset.Open(m_strSQL, adCmdText) != 1)
      {
      //查询出错,取得出错信息并显示在编辑控件里面------------------
      m_strError = GetDocument()->m_adoConnection.GetLastError();
      UpdateData(FALSE);
      m_editError.ShowWindow(SW_SHOW);
      return;
      }
      //下面我用到的有些函数在类中可能没有封装,所以还是使用了try块,以防万一,:(
      try
      {
      //取得记录集的字段数和行数---------------------------------- [Page]
      int nrow = rset.GetRecordCount();
      int ncol = rset.GetFields()->Count;
      //设置网格控件的列数和行数----------------------------------
      m_wndGrid.SetCols(ncol);
      m_wndGrid.SetRows(nrow + 1); // 多留一行以显示字段名
      m_wndGrid.SetFixedCols(0);
      
      CString value;
      //填充字段名-----------------------------------------------
      m_wndGrid.SetRow(0);
      for (int i = 0; i < ncol; i++)
      {
      m_wndGrid.SetCol(i);
      m_wndGrid.SetText(LPCSTR(rset.GetFieldName(i)));
      //设置当前列的大致宽度-------------------------------
      int nwidth = rset.GetFieldDefineSize(i) * 200;
      nwidth = nwidth > 2000 ? 2000 : nwidth;
      m_wndGrid.SetColWidth(i, nwidth);
      }
      
      // 

    大部分转载 小部分自写
  • 相关阅读:
    windows下mysql数据库导入导出
    比较两个数组,根据id删除相同的对象
    angular子组件给父组件传值
    angular父组件给子组件传值
    angular获取dom节点
    angular创建服务
    forEach和for包含异步调用的区别
    用某种符号或字符替换某些字符
    嵌套函数和闭包
    JavaScript 递归
  • 原文地址:https://www.cnblogs.com/8586/p/1295924.html
Copyright © 2020-2023  润新知