C++连接主流数据库经验总结

       在实际开发中,我们经常需要对数据库进行访问,针对不同类型的数据库(如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库。

 

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++可以通过ODBC(Open Database Connectivity)接口来连接达梦数据库。ODBC是一种标准的数据库访问接口,可以实现不同数据库之间的连接和数据操作。 在C++连接达梦数据库的步骤如下: 1. 安装ODBC驱动程序:首先需要安装达梦数据库的ODBC驱动程序,确保系统中已经正确安装了ODBC驱动程序。 2. 包含头文件:在C++代码中,需要包含ODBC相关的头文件,例如`#include <sql.h>`和`#include <sqlext.h>`。 3. 初始化ODBC环境:在代码中使用`SQLAllocHandle`函数初始化ODBC环境,创建一个环境句柄。 4. 连接数据库:使用`SQLConnect`函数连接达梦数据库,需要提供数据库连接信息,如数据库名称、用户名、密码等。 5. 执行SQL语句:连接成功后,可以使用`SQLExecDirect`函数执行SQL语句,如查询、插入、更新等操作。 6. 处理结果:根据需要,可以使用`SQLFetch`函数获取查询结果集中的数据,并进行相应的处理。 7. 断开连接:使用`SQLDisconnect`函数断开与达梦数据库连接。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <sql.h> #include <sqlext.h> int main() { SQLHENV env; // 环境句柄 SQLHDBC dbc; // 连接句柄 // 初始化ODBC环境 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); // 创建连接句柄 SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); // 连接达梦数据库 SQLCHAR* dsn = (SQLCHAR*)"your_dsn_name"; SQLCHAR* uid = (SQLCHAR*)"your_username"; SQLCHAR* pwd = (SQLCHAR*)"your_password"; SQLRETURN ret = SQLConnect(dbc, dsn, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS); if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { std::cout << "Connected to the database." << std::endl; // 执行SQL语句 SQLCHAR* sql = (SQLCHAR*)"SELECT * FROM your_table"; ret = SQLExecDirect(dbc, sql, SQL_NTS); if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { // 处理结果集 // ... std::cout << "SQL statement executed successfully." << std::endl; } else { std::cout << "Failed to execute SQL statement." << std::endl; } // 断开连接 SQLDisconnect(dbc); } else { std::cout << "Failed to connect to the database." << std::endl; } // 释放资源 SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值