在实际开发中,我们经常需要对数据库进行访问,针对不同类型的数据库(如MySQL、sqLite、Access、Excel等),如果采用不同的方法进行连接,会把我们搞崩溃。如果能够采用统一的方式对数据库进行访问,在开发过程中就会变得方便和简单。
在这里,我推荐大使用SQLAPI ++库(百度SQLAPI++就可以下载),它可以用于访问多个SQL数据库(Oracle,SQL Server,DB2,Sybase,Informix,InterBase,SQLBase,MySQL,PostgreSQL,SQLite,SQL Anywhere和ODBC)。当然,也可以让它间接访问Excel,具体方法请看后文。
SQLAPI++语法很简单,只要你会C++都能看懂,上手很快。下面介绍用它访问MySQL:
SAConnection con;
SACommand cmd;
try
{
con.Connect("http://localhost:3306@test","tester", "tester", SA_MySQL_Client);
/*
Connect的parame1为数据库名称,parame2为用户名,parame3为密码,参数4为MySQL驱动
*/
cmd.setConnection(&con);
cmd.setCommandText("select * from student");
cmd.Execute();
while (cmd.FetchNext())
{
string name = cmd.Field("Name").asString();
int id = cmd.Field("ID").asLong();
}
}
catch(SAException &x) { }
代码我就不介绍了,大家都能看懂,接下来介绍连接Oracle示例:
SAConnection con;
SACommand cmd;
try
{
con.Connect("http://localhost:3306@test","tester", "tester", SA_Oracle_Client);
/*
Connect的parame1为数据库名称,parame2为用户名,parame3为密码,参数4为Oracle驱动
*/
cmd.setConnection(&con);
cmd.setCommandText("select * from student");
cmd.Execute();
while (cmd.FetchNext())
{
string name = cmd.Field("Name").asString();
int id = cmd.Field("ID").asLong();
}
}
catch(SAException &x) { }
你应该发现了,连接两种数据库都只用一个地方改变,那就是Connect的第四个参数,使用的驱动不同,其他都一样,可以看出SQLAPI++封装的很好,这也正是我推荐的原因。
那么问题来了,它可以访问主流的数据库,那如果要访问Access怎么办?官网好像没说支持Access数据库,如果要访问Excel文件,我们又该怎么办?
虽然SQLAPI++不支持Access、Excel,但是我们查看它的官方文档会发现,它支持ODBC。介绍一下ODBC:
ODBC是“开放数据库互连”(Open Database Connectivity)的简称。ODBC是MicroSoft公司提出的应用程序通用编程接口标准,用于对数据库的访问。
ODBC实际上是一个数据库访问函数库,使应用程序可以直接操纵数据库中的数据。ODBC是基于SQL语言的,是一种在SQL和应用界面之间的标准接口,它解决了嵌入式SQL接口非规范核心,免除了应用软件随数据库的改变而改变的麻烦。ODBC的一个显著优点是,用它生成的程序是与数据库或数据库引擎无关的,为数据库用户和开发人员屏蔽了异构环境的复杂性,提供了数据库访问的统一接口,为应用程序实现与平台的无关性和可移植性提供了基础,因而ODBC获得了广泛的支持和应用。
说了那么多官方的话,其实ODBC就是一座桥,桥对面是各种数据库,数据通过这座桥才来传出来,虽然SQLAPI++不能过桥去接人(Access、Excel等数据库),但是我在桥口(ODBC)接总没有影响吧!也就是说,ODBC提供了一个数据接口,数据要出来就要通过这个接口,SQLAPI++就可以去这个接口取数据,下面介绍SQLAPI++连接Access和Excel,严格来说,它是连接ODBC。
但是,连接ODBC之前,我们需要先配置ODBC数据源,也就是得先把桥搭好,不然我们取不到数据,配置ODBC数据源可以手动配置,也可以自动配置,具体可参考我之前的博客。
桥(ODBC数据源)搭好之后,我们(SQLAPI++)就可以去桥那里接人了。下面直接上连Access代码:
SAConnection con;
SACommand cmd;
try
{
con.Connect("MyAccess","", "", SA_ODBC_Client);
/*
Connect的parame1为配置好的ODBC数据源名称,parame2为用户名,parame3为密码,参数4为ODBC驱动
*/
cmd.setConnection(&con);
cmd.setCommandText("select * from student");
cmd.Execute();
while (cmd.FetchNext())
{
string name = cmd.Field("Name").asString();
int id = cmd.Field("ID").asLong();
}
}
catch(SAException &x) { }
仔细看你会发现,没多少区别,参数1和参数4变了,参数1少了ip,参数4的驱动变成ODBC的了,参数二三根据自己配置时是否设置用户名选填。少了ip是因为配置ODBC的时候就已经和指定数据库连上了,我们直接去取ODBC数据源的名字就OK了。
SAConnection con;
SACommand cmd;
try
{
con.Connect("MyExcel","", "", SA_ODBC_Client);
/*
Connect的parame1为配置好的ODBC数据源名称,parame2为用户名,parame3为密码,参数4为ODBC驱动
*/
cmd.setConnection(&con);
cmd.setCommandText("select * from [student$]");
cmd.Execute();
while (cmd.FetchNext())
{
string name = cmd.Field("Name").asString();
int id = cmd.Field("ID").asLong();
}
}
catch(SAException &x) { }
连接Excel除了参数1和参数4不同外,仔细看你会发现Sql语句也不同,这里要注意写法,Excel的sql语句有点不同。
到这里,大家应该基本知道ODBC的作用了,那么有人可能会产生这样的疑惑,既然ODBC可以配置所有数据源,那SQLAPI++开发一个连ODBC的接口就行了,干嘛还要MySQL分MySQL,Oracle分Oracle呢?其实这主要是为了效率问题,我直接就可以去取,干嘛还要通过桥(ODBC)呢?直接用数据库各自的驱动,比用ODBC驱动会快很多,因为ODBC属于间接访问数据库,多了一步路。
说到这里,大家应该知道SQLAPI++的强大了吧。但是,SQLAPI++对Excel只能进行数据的读取,不能进行数据的写入,这是因为Excel支持的SQL语句有限造成的。关于Excel数据的写入,可考虑使用libxl库。