一、什么是ODBC

开放数据库连接(Open Database Connectivity,ODBC),每种数据库都有一套API(应用程序编程接口),
开发人员可以根据其API操控数据库。这就是所谓的ODBC API编程。EXCEL表也是一种数据结构(数据库),也有API方便开发人员编写。
二、确定数据源(ODBC)驱动程序已经安装
 通过查看“控制面板”-->"管理工具"下面的“数据源(ODBC)”添加驱动。
ODBC连接数据库,使用到MFC库,所以需要在VS配置属性、常规、MFC使用这一栏中设置一下使用模式
三、例子(通过VS编写)
在利用ODBC编程时,经常要使用到CDatabase(数据库类),CRecordSet(记录集类)和CRecordView(可视记录集类)。 其中:
CDatabase类对象提供了对数据源的连接,通过它你可以对数据源进行操作。
CRecordView类对象能以控制的形式 显示数据库记录。这个视图是直接连到一个CRecordSet对象的表视图。
CRecordSet类对象提供了从数据源 中提取出的记录集。CRecordSet对象通常用于两种形式: 动态行集(dynasets)和快照集(snapshots)。
动态行集能保 持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录;
所不同的是,当你在一个动态行集里滚 动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。
#include <iostream>
#include <afxdb.h>
#include <afx.h>
#include <odbcinst.h>
using namespace std;
/*
使用ODBC来读写Excel。开放数据库连接(Open Database Connectivity,ODBC),每种数据库都有一套API(应用程序编程接口),
开发人员可以根据其API操控数据库。这就是所谓的ODBC API编程。EXCEL表也是一种数据结构(数据库),也有API方便开发人员编写。
*/
void WriteToExcel()
{
CDatabase database;
CString sDriver = "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)";//Excel安装驱动
CString filename ="C:/Users/lilei/Desktop/a.xls"; //准备读写文件  
CString sql; //db执行语句
//创建进行存取的字符串
sql.Format("DRIVER={%s};DSN='Excel nFiles';READONLY=FALSE;DBQ=%s",sDriver, filename);;
//创建数据库(即Excel表格文件)
if(database.OpenEx(sql,CDatabase::noOdbcDialog))
// database.Open(NULL,false,false,sql);
{
//创建表结构
sql="CREATE TABLE aaa(name TEXT,age NUMBER)";
database.ExecuteSQL(sql);
//插入值
sql="insert into aaa(name,age)VALUES('LILEI',26)";
database.ExecuteSQL(sql);
sql="insert into aaa(name,age)VALUES('LILEI',26)";
database.ExecuteSQL(sql);
sql="insert into aaa(name,age)VALUES('LILEI',26)";
database.ExecuteSQL(sql);
}
//关闭数据库
database.Close();
}
string getExcelDriver();
//通过ODBC读Excel表格数据
void ReadFromExcel()
{
CDatabase database;
string sql;
CString item1,item2;
string driver;
string dsn;
string filename= "C:/Users/lilei/Desktop/a.xls";
//检查是否安装Excel驱动“Microsoft Excel Driver(*.xls)”
driver = "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)";
if(driver.empty())
{
cout<<"driver is empty!!"<<endl;
}
//创建进行存储的字符串
CString ssql;
ssql.Format("ODBC;DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DSN='Excel nFiles';DBQ=C:/Users/lilei/Desktop/a.xls");
//打开数据库
database.Open(NULL,false,false,ssql);
/*
要实现对结果集的数据操作,就要用到CRecordSet类。
CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,CRecordSet类定义的记录集可以是表的所有列,也可以是其中的一列,这是由SQL语句决定的。
CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields成员变量保存了记录集中字段的个数,m_nParams成员变量保存了记录集所使用的参数个数
*/
CRecordset recset(&database);
//设置读取的查询语句
sql="SELECT name,age FROM aaa ORDER BY name";
//执行查询语句
recset.Open(CRecordset::forwardOnly,sql.c_str(),CRecordset::readOnly);
//获取查询结果
while(!recset.IsEOF())
{
recset.GetFieldValue("name",item1);
recset.GetFieldValue("age",item2);
cout<<"item1: "<<item1.GetString()<<endl;
//移动到下一行
recset.MoveNext();
}
database.Close();
}
string getExcelDriver()
{
char szBuf[2000];
WORD cbBufMax=2000;
char* pszBuf = szBuf;
string driver;
WORD cbBufOut;
//获取安装驱动的名称(函数在odbcinst.h里)
SQLGetInstalledDrivers(szBuf,cbBufMax,&cbBufOut);
do
{
if(strstr(pszBuf,"Excel Files")!=NULL)
{
driver = pszBuf;
return driver;
}
pszBuf = strchr(pszBuf,'\0')+1;
}while(pszBuf!=0);
return driver;

int main()

{

WriteToExcel();

ReadFromExcel();

return 0;

}

注意事项说明:

virtual BOOL OpenEx(LPCTSTR lpszConnectString, DWORD dwOptions = 0);

如果成功形成连接,则返回非零值;否则如果在出现要求更多连接信息的对话框时,用户选择Cancel,则为0。在其它所有情况下框架产生一个异常。
参数:

lpszConnectString 指定一个ODBC连接字符串。这包括数据源名字和用户ID与密码等其它任选信息。例如“DSN = SQLServer_Source; UID = SA; PWD =abc123”是一个可能的连接字符串。注意到如果为lpszConnectString传递NULL,则将出现数据源对话框,提示用户选择一个数据源。
dwOptions 指定下列值一种组合的位屏蔽。缺省值0表示以共享方式打开数据库,带有写访问,不装入ODBC游标库DLL,并且只有在没有足够信息形成连接时显示ODBC连接对话框。

· CDatabase::openExclusive 此类库版本不支持。为共享(非排它)数据源总是打开的。如果选定此选项,断言失败。
· CDatabase::UseCursorLib 装入ODBC游标库DLL。游标掩盖了基础ODBC驱动程序的一些功能,有效地阻止使用动态集(如果驱动程序支持它们)。如果装入游标库,支持的唯一游标是静态快照和只能向前游标。缺省值为TRUE。如果计划从CRecordset直接创建一个记录集对象而不派生,则不应装入游标库。
· CDatabase::noOdbcDialog 不管是否提供了足够的连接信息,不显示ODBC连接对话框。
· CDatabase::forceOdbcDialog 总是显示ODBC连接对话框。

说明:
调用这个成员函数,可以初始化一个新构造的CDatabase对象。必须在用来构造记录集对象前初始化数据库对象。
如果OpenEx调用中的lpszConnectString参数不包含形成连接的足够信息,则ODBC驱动程序打开一个对话框,从用户那里得到必要信息。假设你没有在dwOptions选择中设置CDatabase::noOdbcDialog或CDatabase::forceOdbcDialog。调用OpenEx时,连接字符串lpszConnectString自己存放在CDatabase对象中,并且可以通过调用GetConnect成员函数成为有效。
如果需要的话,可以在调用OpenEx之前打开自己的对话框,从用户处获取密码等信息,然后把那些信息加到传递到OpenEx的连接字符串。
或者有可能想保存传递的连接字符串,这样在应用等到下次调用OpenEx时可以在CDatabase对象上重用它。

virtual BOOL Open(LPCTSTR lpszDSN,

BOOL bExclusive = FALSE,
                  BOOL bReadOnly = FALSE,
                  LPCTSTR lpszConnect = _T("ODBC;"),
                  BOOL bUseCursorlib = TRUE
                 );
  throw(CDBException,CMemoryException);
如果成功形成连接,则返回非零值;否则如果在出现要求更多连接信息的对话框时用户选择Cancel,则为0。在其它所有情况下框架产生一个异常。
参数:

lpszDSN 指定一个数据源名字──通过ODBC管理程序登记的名字。如果在lpszConnect中指定了DSN值(以“DSN = <数据-源>”格式),则不能再在lpszDSN中指定。这时lpszDSN应为NULL。否则,如果想为用户提供一个数据源对话框,用户可以从中选择数据源,则可以传递NULL。有关详细信息,请参阅说明。
bExclusive 这个版本类库中不支持。当前如果这个参数为TRUE,则断言失败。数据源总以共享形式(非独占)打开。
bReadOnly 如果想让连接只读或者禁止对数据源的更新,则为TRUE。所有相关记录集继承这个属性。缺省值为FALSE。
lpszConnect 指定一个连接字符串。连接字符串连接一串信息,可能包括数据源名字、数据源上的用户ID、用户认证字符串(如果数据源需要的密码)和其它信息。整个连接字符串必须以字符串“ODBC;”作前缀(大写或小写)。“ODBC;”字符串用来表示这是到ODBC数据源的连接;类库的以后版本可能支持非ODBC数据源,这是向上兼容的。
bUseCursorLib 如果想装入ODBC游标库DLL,则为TRUE。光标掩盖了基础ODBC驱动程序的一些功能,有效地阻止使用动态集(如果驱动程序支持它们)。如果装入游标库,支持的唯一光标是静态快照和只能向前游标。缺省值为TRUE。如果计划从CRecordset直接创建一个记录集对象而不派生,则不应装入游标库。

}

注意:sql.Format("DRIVER={%s};DSN='Excel nFiles';READONLY=FALSE;DBQ=%s",sDriver, filename);

DSN表示驱动名,driver表示驱动。这是不能省略的,必须附上值

c++使用ODBC读取EXCEL表格相关推荐

  1. 如何读取Excel表格中不同sheet表的同一位置单元格数据,并绘制条形图呢?

    作者 | 黄伟呢 来源 | 数据分析与统计学之美 今天,有位朋友在群里面咨询了一个问题:如何读取Excel表格中"不同sheet表"的同一位置单元格数据,并绘制条形图呢? 有人提议 ...

  2. python读取excel表格-python读取excel表格中的数据

    使用python语言实现Excel 表格中的数据读取,需要用到xlrd.py模块,实现程序如下: import xlrd #导入xlrd模块 class ExcelData(): def __init ...

  3. python画柱状图和折线图-Python读取Excel表格,并同时画折线图和柱状图的方法

    今日给大家分享一个Python读取Excel表格,同时采用表格中的数值画图柱状图和折线图,这里只需要几行代码便可以实. 首先我们需要安装一个Excel操作的库xlrd,这个很简单,在安装Python后 ...

  4. python3读取excel数据-python3读取Excel表格数据的代码分享

    python3 读取Excel表格中的数据 需要先安装openpyxl库 通过pip命令安装: pip install openpyxl 源码如下: #!/usr/bin/python3 #-*- c ...

  5. python3读取excel数据-python3 读取Excel表格中的数据

    需要先安装openpyxl库 通过pip命令安装: pip install openpyxl 源码如下: #!/usr/bin/python3 #-*- coding:utf-8 -*- import ...

  6. .读取excel表格(JAVA)

    读取excel表格(JAVA) 偶尔写个小程序,让办公更简单一些.   在这里使用到JXL(Java Excel API)用来动态读写Excel文件.JXL的主页是:http://www.andykh ...

  7. android 自动读取ecxel_android 读取excel表格数据,并存入数据库

    最近策划提了个需求,但是已有的数据不能满足需要,于是内容资源部制作了份excel表格补充.So,任务来了,读取并使用excel数据.由于感觉excel表格里的数据使用频率较高,那么就不能等到需要了才去 ...

  8. python导入数据画折线图_Python读取Excel表格,并同时画折线图和柱状图的方法

    今日给大家分享一个Python读取Excel表格,同时采用表格中的数值画图柱状图和折线图,这里只需要几行代码便可以实. 首先我们需要安装一个Excel操作的库xlrd,这个很简单,在安装Python后 ...

  9. JAVA读取Excel表格,建数据库建表,并生成java实体实例

    转自:https://blog.csdn.net/wuyongde_0922/article/details/43233413 JAVA读取Excel表格,建数据库建表,并生成java实体实例,这一篇 ...

最新文章

  1. 人工智能“花”落何处
  2. 老李案例分享:Weblogic性能优化案例
  3. 【算法的时间复杂度和空间复杂度】-算法02
  4. tcp http https
  5. 安装 |GitBash闪退问题解决方案及Git安装教程( win10系统安装Git后)
  6. openwrt 替换Dropbear by openssh-server
  7. thinkphp extend.php,【ThinkPHP5.1】如何引用extend的类库
  8. 监听滚动条和浏览器大小变化
  9. 开放地址法开放地址法
  10. 记一次被自己DDOS攻击
  11. 史上最强三千六百道脑筋急转弯
  12. ZigBee-CC2530单片机 - 实现软件自动复位
  13. html调色板快捷键,12款web前端最佳调色板工具
  14. java程序设计实验报告代写_代做CS实验报告、代写java c/c++ CS课程设计作业、代写程序作业...
  15. uniapp实现上传图片
  16. 学习python:练习2.投资理财计算器
  17. 负载均衡之TCP连接复用与缓冲
  18. 用C语言给自己的奖状
  19. JS实现保存当前页面
  20. 计算机辅助设计还需要手绘吗,建筑设计师,还需要手绘吗?

热门文章

  1. 鸿蒙系统与麒麟os,华为鸿蒙系统改名为麒麟OS
  2. RtlCopyMemory致使的蓝屏
  3. 大数据与个人征信市场发展
  4. BUUCTF Misc杂项前十二道题的思路和感悟
  5. 好莱坞原则和IOC控制反转
  6. 在html中雪碧图的坐标怎么看,Webpack中雪碧图使用详解
  7. H3C以太网基础实验H3CTE讲师分享
  8. 记一次阿里云ECS实例预约迁移
  9. web安全问题-1.安全世界观
  10. uva 672 - Gangsters(dp)