在MFC应用程序中实现数据库交互的控件,可以极大地提高数据操作的效率和用户体验。本文将介绍如何创建一个自定义的数据库控件,以及如何使用它来实现数据的绑定、更新、添加记录、排序、格式化日期和过滤等功能。
创建数据库控件的过程与创建MFC网格控件类似,但需要定义变量为CDbMFCGrid而不是CGridCtrl。此外,还需要将msado15.dll导入到项目中。在stdafx.h文件中,可以添加如下代码:
#import "E:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
这段代码将ADO库导入到项目中,使得控件能够与数据库进行交互。
作者已经测试了该控件与SQL Server的大多数数据类型,除了Image、binary、timestamp、sql_variant、uniqueidentifier等类型。对于MS-Access数据库,这些类型也不常见,因此不会对显示在网格中的类型造成太大麻烦。未来可能会添加这些特性。
使用控件非常简单。首先,按照MFC网格文章中描述的方式创建网格,然后为其提供数据源和SQL字符串,接着使用Bind()和FillGrid()函数:
m_gridctrl.m_strDataSource = L"Provider=SQLOLEDB.1;Integrated Security=SSPI;...";
m_gridctrl.m_strQuery = "select * from Table1";
m_gridctrl.Bind();
m_gridctrl.FillGrid();
这样,控件就会读取数据源并填充网格。如果网格不是只读模式,用户编辑单元格时,它将自动更新数据库;如果用户选择一行或多行并按DELETE键,它将从数据库和网格中删除记录。
要添加记录,首先需要向网格中添加一个新行(必须添加到最后一行),然后调用AddNewRecord()函数。这个函数总是读取网格的最后一行并将其添加到数据库中:
m_gridctrl.Refresh();
m_gridctrl.AddNewRecord();
控件会在点击固定列时自动根据单元格类型对行进行排序。
对于所有日期/时间类型,作者将其转换为"%d/%m/%Y"格式并放入网格中。如果需要其他日期/时间格式,必须在两个地方编辑代码。首先,在CDbMFCGrid::FillGrid()函数中找到以下代码行:
CString str1 = date.Format(_T("%d/%m/%Y"));
将其更改为所需的格式,然后在CALLBACK CDbMFCGrid::pfnCellDateCompare函数中进行相应的代码更正。这个函数用于比较两个日期/时间值并排序日期/时间列。
过滤网格也非常简单:
m_gridctrl.pRecordset->Filter = "col1 ='Mazy'";
m_gridctrl.FillGrid();
这样就可以根据指定的条件过滤网格中的数据。
如果在程序中使用SetItemText()并希望更新数据库,必须在SetItemText()之后调用CDbMFCGrid::UpdateCell(int iRow,int iCol):
CDbMFCGrid::UpdateCell(int iRow,int iCol)