ODB - C++ 訪問資料庫的利器--Hello World On Windows(Version-24)
本文以MySQL資料庫為例,其他資料類似。
官方文件和下載
安裝下載首頁(下載與安裝教程Windows/Linux)
Windows安裝步驟(都是英文版,流程雖然詳細,但是卻略顯麻煩,主要是因為ODB的機制造成的)
ODB的使用原理
下面介紹ODB的使用原理來說明為什麼會有這麼多步驟:
ODB的架構和流程
(1)你自己定義一個C++的Person類.h/.cpp (2)用安裝的ODB Compiler編譯Person.h得到新的必選:
MySQL官方C開發庫
只用這個即可同時開發C++程式
作用:這個是MySQL官方提供的用於C開發程式讀寫MySQL提供標頭檔案和動態連結庫檔案以及靜態連結庫檔案,跟ODB沒有任何關係。
這個不需要編譯,提供現成的標頭檔案和庫檔案。可以用C直接讀寫MySQL資料庫。
官方下載地址(全部都有自己選): libmysqlclient
百度雲下載僅提供:【mysql-connector-c-6.1.6-win32.zip】或者【mysql-connector-c-6.1.6-winx64.zip】
MySQL官方C++開發庫
不建議用:後來發現/cpp裡面下載的壓縮檔案中並沒有【mysql_version.h】和【mysql_time.h】而是在/c的C版本包裡有。所以下載了上面/c網址下的包。
下載並使用ODB編譯器
官方下載地址 百度雲下載: odb-2.4.0-i686-windows.zip主要功能:將自定義ODB結構編譯生成標準的.hxx標頭檔案和標準的.cxx原始檔。
這個是個bin/odb.exe可執行檔案,免安裝。要想使用這個EXE只需要開啟CMD終端,將目錄切換到此目錄即可執行:
上圖表示odb已經可以使用。
下載並編譯LIBODB:libodb-2.4.0.zip
主要作用:官方名稱叫一般執行時庫Common Runtime Library (libodb),odb的主要功能介面都在這個庫裡面提供。這裡面有原始碼和VS工程,編譯完生成的庫檔案即可投入使用。
下載並編譯資料庫執行時庫LIBODB-<DATABASE>
官方下載地址 libodb-mssql-2.4.0.zip、libodb-oracle-2.4.0.zip、libodb-mysql-2.4.0.zip
百度雲下載:libodb-mssql-2.4.0.zip、libodb-oracle-2.4.0.zip、libodb-mysql-2.4.0.zip
主要作用:將第三方資料庫介面封裝成統一介面給libodb,從而實現跨資料庫訪問。這些執行時庫用VS Building之後會生成lib和dll檔案。
libodb-mysql在編譯的時候需要兩個東西(參考INSTALL檔案):
(1)libodb-2.4.0中編譯生成的標頭檔案和連線庫
(2)MySQL的客戶端包,也就是【mysql-connector-c-6.1.6-win32.zip】裡面的標頭檔案和連線庫
新增方法參考:http://blog.csdn.net/calmreason/article/details/6989390
直接編譯會因為(1)(2)你沒有提供而報錯:
將libodb的/lib和/odb目錄拷貝到libodb-mysql的工程中覆蓋
重新編譯提示缺少mysql-connector-c標頭檔案:
將mysql-connector-c-2.4.0中的include和lib目錄拷貝到odb-mysql-2.4.0的工程中覆蓋
重新設定工程屬性,編譯,編譯成功:
Debug生成lib【odb-mysql-d.lib】和dll【odb-mysql-d-2.4-vc10.dll】檔案
Release生成lib【odb-mysql-d.lib】和dll【odb-mysql-d-2.4-vc10.dll】檔案
編譯執行Hello World
官方下載地址 百度雲下載:odb-examples-2.4.0.zip
選擇examples版本(以MySQL為例):
將【hello-mysql-vc10】project設定為啟動專案,直接編譯會報錯:error MSB6006: "cmd.exe" exited with code 9009.
這是odb環境變數沒有設定成功的問題,需要將odb.exe路徑設定到系統path變數中(最好重啟生效)
之後會提示缺少一些標頭檔案:主要是libodb的標頭檔案、libodb-mysql的標頭檔案
其實是需要:LIBODB(odb-d.lib)、LIBODB-<MYSQL>(odb-mysql-d.lib).(LIBMYSQLCLIENT(mysql-connector-c-6.1.6-win32)這個已經被編譯到odblib-mysql中了,所以不需要了)。
標頭檔案自己加,庫檔案需要什麼工程裡已經為你寫好了:
由於剛才在編譯libodb-mysql的時候已經將libodb和mysql-connector-c的資源新增過了。
所以現在只需要將libodb-mysql中的:include、odb、lib這三個目錄靠過來並在example(或者你自己的工程)工程屬性中新增引用即可。
目前專案中的【person.hxx】檔案是一個odb模板檔案,還不能直接被VS編譯使用,專案中的【person-odb.hxx】、【person-odb.cxx】、【person-odb.ixx】也只是空引用,打不開,因為這些檔案還不存在,需要odb編譯器編譯之後生成新的.h檔案和.cpp檔案才可以被CPP專案使用
將【person.hxx】拷貝到odb的bin目錄下,cmd執行:odb -d mysql --generate-query --generate-schema person.hxx
執行完生成【person-odb.hxx】、【person-odb.cxx】、【person-odb.ixx】、【person.sql】這四個檔案:
將這四個檔案拷貝到本專案【person.hxx】檔案同級目錄下
建立資料庫表
用【person.sql】建立資料庫表。
可以成功編譯:
生成的檔案driver.exe在目錄:【F:\程式設計開發\C++\ODB\odb-examples-2.4.0\odb-examples-2.4.0\hello\Debug】下,為了執行exe,需要將執行時庫檔案
libmysql.dll、odb-d-2.4-vc10.dll、odb-mysql-d-2.4-vc10.dll拷貝到此目錄。
執行Start Without Debugging:
2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
請按任意鍵繼續. . .
可以看出程式預設連線本機的MySQL服務,並且企圖訪問埠:10061。
其實這需要具體的設定:ip,port,usr,psw,預設情況下程式使用命令列獲取這些資訊,參考2.3 Compiling and Running,關於如何使用database的建構函式直接傳遞資料庫訪問資訊參考:3.4 Database
直接修改程式碼,在程式碼中寫死連線資料庫的資訊:
原來的程式碼:
[cpp] view plain copy- auto_ptr<database> db (create_database (argc, argv));
修改訪問資料庫的程式碼:
[cpp] view plain copy- auto_ptr<odb::database> db (
- new odb::mysql::database (
- "root" // database login name
- ,"123456" // database password
- ,"collect" // database name
- ,"localhost"
- ,13306
- ));
這個例子可以跑起來其實是需要odb的所有步驟的,其他例子均可仿照這個例子的做法,自己建立的專案引用odb也是如此!奔跑吧,小怪獸!!