使用odbc的若干问题

文章目录

    • odbc API
    • 连接字符串
    • 关于Driver版本的选择
    • odbc driver 下载
    • 关于数据库连接
    • server
    • odbc支持哪些数据库
    • 一个例子

odbc API

本文为使用和测试方便,使用的是经过wrapper后的源代码,可以在github上下载直接使用,点击这里下载

连接字符串

以SQL Server 2017为例,连接字符串如下,

Driver={ODBC Driver 13 for SQL Server};Server=servername;Database=databasename;UID=usrname;PWD=password

其中,Driver={ODBC Driver 13 for SQL Server};为odbc驱动,可以通过以下方式查看,
开始>odbc数据源管理程序>驱动程序
使用odbc的若干问题_第1张图片

关于Driver版本的选择

截至目前为止,总共有三个版本的Microsoft ODBC driver for sql server,选择和使用如下,

ODBC driver sql server database version 安装
SQL server <2005 通常情况下系统默认安装
SQL Server Native Client * 2005~2012 单独安装或者随sql server数据库一起安装
ODBC Driver * for SQL Server 2012~ 单独安装或者随sql server数据库一起安装

如果driver的版本与数据库版本不一致很可能会出现各种问题,以以SQL Server 2017为例,应该选取下边的版本。
使用odbc的若干问题_第2张图片

odbc driver 下载

点击这里查看下载

关于数据库连接

对于数据库的连接,可以使用两种接口,对应连接数据库的两种方式,

void connect(const char* connString);
void connect(const char* dsn, const char* user, const char* password);

分别对应于SQLDriverConnectA和SQLConnectA的调用。
第一种调用就是使用连接字符串(个人一直倾向于使用此种方式),另一种方式使用dsn name,也可以通过odbc 配置软件进行配置。

server

连接字符串中的server name,可以用ip地址,如果是本机部署的话可以写127.0.0.1,也可以用(local),也可以用服务器名。
注意当改变连接端口时,必须指定数据库服务的监听端口。
对于sql server来说,原则上能用sql server客户端连接的servername 都可以写在这里用。
使用odbc的若干问题_第3张图片

odbc支持哪些数据库

odbc全称开放数据库库接口,Open Database Connectivity,是为了连接DBMS的标准API,设计初衷就是,对于不同的数据库甚至操作系统,开发者不做或很少改动就可以继续使用原有代码操作数据库(包括client和server)。
只要提供相应的驱动,原则上可以使用odbc连接任意DBMS,甚至是excel,text,或者csv。

在之前的程序开发中,对于excel作为数据源的开发确实使用的就是odbc,但是text和csv从来没这么做过,似乎也没什么必要。

一个例子

另外,对于本文提到的开源代码,写了一个简单的应用(其实没必要,但是似乎一点儿代码也贴总感觉哪里不对>_<)

void RoverDataBase::load_from_db()
{
   try {
      odbc::EnvironmentRef env = odbc::Environment::create();
      odbc::ConnectionRef conn = env->createConnection();
      conn->connect("Driver={ODBC Driver 13 for SQL Server};Server=127.0.0.1;Database=HSDB;UID=sa;PWD=xqxq#1234");
      conn->setAutoCommit(false);
      log_info("connect database success");

      odbc::PreparedStatementRef psSelect =
         conn->prepareStatement("SELECT id,port FROM T_USR");
      odbc::ResultSetRef rs = psSelect->executeQuery();
      while (rs->next())
      {
         log_info("%s %d", *(rs->getString(1)), *(rs->getInt(2)));
      }
   }
   catch (const odbc::Exception e) {
      log_error("%s", e.what());
   }
}

你可能感兴趣的:(c++,数据库)