CDatabase database;
CString sSql;
CString sItem1, sItem2 , sItem3;
CString sDriver;
CString sDsn;
CString sFile,sPath;
CDBVariant varValue;
//获取主程序所在路径,存在sPath中
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos=sPath.ReverseFind ('//');
sPath=sPath.Left (nPos);
sFile = sPath + "file://Demo.xls/"; // 将被读取的Excel文件名
// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!");
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 设置读取的查询语句.注意此处表名的写法,excel里的表默认为系统表所以访问表时表名应为[表名$]
sSql = "SELECT 考生编号,考生姓名,来源 "
"FROM [student2$] "
"ORDER BY 考生编号 ";
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 获取查询结果
while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("考生编号", sItem1);
recset.GetFieldValue("考生姓名", sItem2);
recset.GetFieldValue("来源", sItem3);
//显示记取的内容
m_ExcelList.AddString( sItem1 + " --> "+sItem2 );
// 移到下一行
recset.MoveNext();
}
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
}
注意问题:
1、如excel表中某列既有数字又有字母等数据类型不一致时,读入为某一类型(如CString类型)时,会出一些异常情况,要先判断读入是什么类型,再进行处理。如:
CDBVariant varValue;
recset.GetFieldValue("天线方向",varValue);
switch(varValue.m_dwType)
{
case DBVT_DOUBLE:
direction.Format("%.5f",varValue.m_dblVal);
break;
case DBVT_LONG:
direction.Format("%ld",varValue.m_lVal);
break;
case DBVT_STRING:
direction = varValue.m_pstring->GetBuffer(6);
break;
}
CDBVariant类成员
数据成员
m_dwType 包含当前存储值的数据类型。DWORD型
m_boolVal 包含一个BOOL型值
m_chVal 包含一个unsigned char型值
m_iVal 包含一个short型值
m_lVal 包含一个long型值
m_fltVal 包含一个float型值
m_dblVal 包含一个double型值
m_pdate 包含指向TIMESTAMP_STRUCT型对象的指针
m_pstring 包含一个CString型值
m_pbinary 包含一个CLongBinary型值
CDBVariant::m_dwType
说明:
这个数据成员包含用于当前在CDBVariant对象的联合数据成员中存储的值的数据类型。访问这个联合之前必须检查m_dwType的值,以确定要访问哪个联合数据成员。下表列出m_dwType的可能值和相应的联合数据成员。 m_dwType 联合数据成员
DBVT_NULL 没有联合成员对访问有效
DBVT_BOOL m_boolVal
DBVT_UCHAR m_chVal
DBVT_SHORT m_iVal
DBVT_LONG m_lVal
DBVT_SINGLE m_fltVal
DBVT_DOUBLE m_dblVal
DBVT_DATE m_pdate
DBVT_STRING m_pstring
DBVT_BINARY m_pbinary
2、字段有空格时,用中括号括起来
sSql = "SELECT LAC,CI,[CELL ID],基站名,MSC,BSC,LAC,CI,BSIC, BCCH,TCH信道数,天线方向,天线高度,天线下倾,longitude,latitude,基站地址,frequency FROM [Exceldemo$] " ;