WEB开发网
开发学院软件开发VC 使用ADO封装类的数据库程序开发实例(下) 阅读

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

 2008-04-19 20:27:56 来源:WEB开发网   
核心提示:七.写一个数据查询工具(我对实现过程只稍作了介绍,具体内容请参考源代码):7.1 连接数据库首先要编写连接到数据库的代码,使用ADO封装类的数据库程序开发实例(下)(2),为此,我写了一个对话框类(CLogoDig)用来选择不同的数据源,所以还是使用了try块,以防万一,:(try{//取得记录集的字段数和行数--in

七.写一个数据查询工具(我对实现过程只稍作了介绍,具体内容请参考源代码):

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类

在这个数据查询工具中我们使用了另外两个类: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
  {
    //取得记录集的字段数和行数----------------------------------
    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);
    }
    
    //读取记录集-----------------------------------------------
    int n = 1;
    while (!rset.IsEOF())
    {
      m_wndGrid.SetRow(n);
      n++;
      for (int i = 0; i < ncol; i++)
      {
        m_wndGrid.SetCol(i);
        rset.GetValueString(value, (long)(i));
        m_wndGrid.SetText(LPCTSTR(value));
      }
      rset.MoveNext();
    }
    m_wndGrid.ShowWindow(SW_SHOW);
  }
  catch (_com_error)
  {
    return;
  }
}

记录集用完后,可以及时用Close()将它关闭,以释放相应的资源. CAdoRecordSet类折构函数,会自动关闭记录.

Tags:使用 ADO 封装

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接