使用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數據源管理程序>驅動程序
在這裏插入圖片描述

關於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 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支持哪些數據庫

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());
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章