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("已是最后一页!");
}
}