vc下利用cado class和datagrid分页显示数据库access内容

来源:互联网 发布:c语言编译器下载 编辑:程序博客网 时间:2024/06/06 10:48

 背景:

1、用VC操作数据库是非常麻烦的,网上关于VC下利用ADO和datagrid操作数据库的教程也很多,但无非是相互抄袭。

2、ADO使用起来麻烦,然而一个老外写的ADO Classes我感觉还是挺好用的。包括两个文件ado2.h和ado2.cpp,而网上关于使用这个类进行ADO数据库操作的文章不多。

3、VC6.0下的datagrid貌似没有.net的那么强大,也没有VB6那么好用。连分页都显得麻烦,ADO自带的虚拟分页功能好像在datagrid上不好使。更要命的是,MSDN上的参考文献主要是针对VB的。

4、虽然VC6确实已经落伍不少,不过其经典性还是很明显的。而且网络资源也比较多,适合初学者尽快熟悉掌握VC开发。

摘要:

本文主要初步介绍在VC6环境下利用CADO class,datagrid分页显示数据。

首先介绍一下CADO class,这个类是一个老外自己写的,方便在VC下利用ADO操作数据库,包含两个文件,ado2.h,ado2.cpp

详细信息参阅http://www.codeproject.com/KB/database/caaadoclass1.aspx,不过是英文的。

首先将ado2.h和ado2.cpp文件添加的工程中。再点工程——添加到工程——components and Controls——Microsoft DataGrid control 6.0——Insert——先只选CDataGrid类——MFC classWizard——MemberVariables——Add Variable。创建一个datagrid类型的变量,并与刚刚添加的控件ID关联。

关键代码解释

代码中的几个主要的变量的说明

int PageNum;
int   OffSet;
int   PageSize;
CADORecordset   m_Rs;
CADODatabase   m_DBCn;

enum { IDD = IDD_ASTGTEST_DIALOG };
     CDataGrid   m_ctrlDG3;

在 CASTGTestDlg::OnInitDialog()里添加代码:

CString strConnection;
     strConnection.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;")
   _T("Data Source=note.mdb"));
     m_DBCn.Open((LPCTSTR)strConnection); //打开程序数据库
m_Rs.SetDatabase(&m_DBCn);//recordset与database关联。此处使用的是version2.1的,version2.2版本中已经不存在此函数。可以用以下的方法产生关联CADORecordset* pRs = new CADORecordset(pAdoDb);
//设定分页的各项参数
PageSize=3;     //每页record条数
PageNum=3; //因为数据库里有9条数目,为了节省时间,就直接计算出了总页数,在实际编写中,需要根据总数计算得出动态的条目数。
OffSet=1; //现在处于的页数
CADOCommand m_Com(&m_DBCn,L"select top 3 * from test order by id;",CADOCommand::typeCmdText);     //增加CADOCommand对象,操作数据库的SQL语句可以放在此对象里面。

m_Rs.Execute(&m_Com);   //执行Command里的SQL语句
m_ctrlDG3.SetCaption(_T("AST小组"));   //设置datagrid控件的标题
m_ctrlDG3.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset());   //将datagrid与recordset相关联。

 

//对话框的“上一页”按钮对应的代码
void CASTGTestDlg::OnUp() 
{
// TODO: Add your control notification handler code here
if ((OffSet-2)>0)
{
   CString strSQL;
  //以下SQL语句用于分页,具体语法可以查阅相关SQL手册
   strSQL.Format(_T("select top %d * from test where (id not in (select top %d id from test order by id)) order by id;"),PageSize,(OffSet-2)*PageSize);

   CADOCommand m_Com(&m_DBCn,strSQL,CADOCommand::typeCmdText);
   m_Rs.Execute(&m_Com);
   m_ctrlDG3.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset());
   m_ctrlDG3.Refresh();
   OffSet--;
}
else
{

   CADOCommand m_Com(&m_DBCn,L"select top 3 * from test order by id;",CADOCommand::typeCmdText);
   m_Rs.Execute(&m_Com);
   m_ctrlDG3.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset());
   m_ctrlDG3.Refresh();
   OffSet=1;
}
}

 

//对话框“下一页”按钮对应代码
void CASTGTestDlg::OnNext() 
{
// TODO: Add your control notification handler code here
if (OffSet<PageNum)
{
   CString strSQL;
   strSQL.Format(_T("select top %d * from test where (id not in (select top %d id from test order by id)) order by id;"),PageSize,OffSet*PageSize);

   CADOCommand m_Com(&m_DBCn,strSQL,CADOCommand::typeCmdText);
   m_Rs.Execute(&m_Com);
   m_ctrlDG3.SetRefDataSource((LPUNKNOWN)m_Rs.GetRecordset());
   m_ctrlDG3.Refresh();
   OffSet++;
}
else
{
   MessageBox("已是最后一页!");
}

}