作者:罗亭
概述:
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。本程序基于VC软件平台,使用ADO组件访问excel表格形式的成绩单,实现成绩计算及统计。
【关键字】:ADO; excel;
步骤及说明:
1. 在StdAfx.h头文件中,用#import指令引入ADO类型库 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
说明:本程序首先在XP系统上编译并链接成功,生成.exe文件,放在目标机器win7系统中运行报数据库链接失败,经查阅网页(http://www.docin.com/p-349640117.html): 原因为操作系统msado15.dll动态链接库文件不同,在不同操作系统运行时,需先替换相应操作系统的链接库重新编译。
2. COM库的初始化,这项工作通常在CWinApp::InitInstance()的重载函数中完成
if (!AfxOleInit()) { AfxMessageBox("初始化OLE DLL失败:("); return FALSE; }
3. //创建Connection对象并连接数据库
_Connection m_pConnection; BOOL CGradeCounterDlg::ConnectionDb() { //创建ADO连接 m_pConnection.CreateInstance(__uuidof(Connection)); CString strSQL; strSQL.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s; Extended Properties = Excel 5.0;Persist Security Info=False",m_fn); //m_fn表示输入的excel文件路径名
说明:
(1)通过Microsoft Jet 数据库引擎实现对Excel表的连接;
(2)不同版本的Excel对应不同的属性值:用于 Extended Properties 值设置有效 Excel 版本。 对于 Microsoft Excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,使用 Excel 8.0;
(3)Excel 工作簿的区域中第一行默认认为可标题行 (或字段名)。如果第一个区域不包含标题, 可指定 HDR = NO 您连接字符串中扩展属性中。 如果首行不包含页眉, OLEDB 提供程序自动名称字段对 (其中将 F 1 表示第一个字段, F2 将表示第二个字段等))
try{ //打开****.xls m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown); } catch (_com_error e) { CString strError; strError.Format("警告:打开链接发生异常。错误信息:%s",e.ErrorMessage()); AfxMessageBox(strError); return false; } return true; }
4. 创建记录集对象
_RecordsetPtr m_pRecordset; CString strSQL=_T(""); strSQL.Format(_T("SELECT * FROM [Sheet1$] "));//excel表名称需写成[xxx$]形式,否则编译时出现IDispatch error #3127错误 m_pRecordset.CreateInstance(__uuidof(Recordset)); try{ m_pRecordset->Open((_bstr_t)strSQL.AllocSysString(), (_variant_t)m_pConnection.GetInterfacePtr(),// 获取库接库的IDispatch指针 adOpenDynamic, adLockOptimistic, adCmdText); } catch (_com_error e) { CString strError; strError.Format("警告:打开数据表时发生异常。错误信息: %s",e.ErrorMessage()); AfxMessageBox(strError); return ; }
5. 成绩计算统计
获取表格数据时可以使用m_pRecordset->GetFields()->GetItem((long)i)->Value;A列为第0列,B列为第1列,使用另一种函数m_pRecordset -> GetCollect(L"字段名")编译错误,原因可能是字符段名为汉字,表格单元格式为数值或常规时,数据类型默认为VT_R8,即_variant_t.vt = VT_R8,表示数据为double型数据。
写入计算结果到excel表格可以使用m_pRecordset -> GetFields() -> GetItem((long)i) -> Value = _variant_t(result),result表示计算结果。
6. 程序说明:
本程序基于ADO组件动态访问excel表格,计算学生成绩总分,公式为D+E+H*0.7,统计最高分,最低分,平均分,统计优秀,良好,中等,及格,不及格学生人数及所占比例。