使用ADO封装类的数据库程序开发实例(下)
2008-04-19 20:27:56 来源:WEB开发网七.写一个数据查询工具(我对实现过程只稍作了介绍,具体内容请参考源代码):
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类折构函数,会自动关闭记录.
更多精彩
赞助商链接