Embedded MySQL其實是一個DLL,它的名字是libmysqld.dll。
有了它,你的程式裡就等於內建了一個DBMS,
而不必實際去run一個database daemon並和它互動。
1. 設定C::B的Build options
首先,你必須先下載MySQL community server (Windows版本),
建議使用Without Installer來安裝(直接解壓縮就可以使用了,我最喜歡的方式)
在 MYSQL_DIR\Embedded\DLL下有release和debug兩種DLL可以使用,
檔名都是libmysqld.dll,把你需要的dll複製到你的project 裡可執行檔所在的資料夾。
接下來就是修改C::B的設定
1) Project -> Build options -> 右邊的樹狀圖中點選你的project名稱(不是點debug或release哦)
右邊選 [Search Directory] -> [compiler],並加入
$(#mysql)\include
註: $(#mysql) 是global variable,請設定為你的MYSQL_DIR
其設定方法可參考下面的文章 免安裝、輕量、跨平台的GUI開發環境
做了上述的動作後,當你在程式碼中加入 #include
接下來,你必須把libmysqld.dll 的import library加入linker的設定中
註: import library的說明可以參考MinGW 程式環境(一)
因為不同的編譯組態(release/debug)會使用不同的import library,
所以請對release及debug分別用下列的方式作設定:
a) [Search Directory] -> [linker] 加入import library所在的資料夾路徑
例如: $(#mysql)\Embedded\DLL\release
b) [Linker settings] -> 加入liblibmysqld.a
liblibmysqld.a就是libmysqld.dll的import library
但我們目錄中沒有這個檔案,所以我們必須想辦法產生,
我們可以發現release或debug目錄中有一個檔案叫 libmysqld.lib
這個是VC所使用的import library,我們必須想辦法把它轉成liblibmysqld.a。
詳細的說明請見
How can an MSVC program call a MinGW DLL, and vice versa?
簡單的說你必須下載 reimp這個工具
然後執行reimp libmysqld.lib
(注意: 它會用到MinGW/bin/dlltool,所以記得先把Path設好)
做好上述的動作,C::B的設定就完成了
2. 程式碼及my.ini的設定
-------------程式碼如下-----------------
#include
...
char *server_options[] = {/*unused */ "mysql_test" , "--defaults-file=.\\my.ini" };
// char *server_options[] = {/*unused */ "mysql_test" , "--defaults-file=e:\\my.ini" };
char *server_groups[] = {"libmysqld_server", "libmysqld_client", (char*) NULL};
const int num_opts = sizeof(server_options) / sizeof(char *);
/* server init */
if(mysql_server_init(num_opts, server_options, server_groups))
wxMessageBox(wxT("mysql_server_init fail\n"), wxT("fatal error"), wxOK);
/* client init */
MYSQL* mysql = mysql_init(NULL);
if(mysql == NULL)
wxMessageBox(wxT("mysql_init fail\n"), wxT("fatal error"), wxOK);
if(mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client"))
wxMessageBox(wxT("mysql_options1 fail\n"), wxT("fatal error"), wxOK);
if(mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL))
wxMessageBox(wxT("mysql_options2 fail\n"), wxT("fatal error"), wxOK);
if(mysql_real_connect(mysql, NULL, NULL, NULL, "saledb", 0, NULL,0) == NULL)
wxMessageBox(wxT("mysql_real_connect fail - %s\n"), wxT("fatal error"), wxOK);
------------------- END ----------------------------
------------- my.ini 設定如下 -----------------
[libmysqld_client]
default-character-set=utf8
[libmysqld_server]
basedir=./DB
datadir=./DB/data
default-character-set=utf8
-------------------- END ---------------------------
注意,在basedir下,一定要有data及share兩個資料夾,
直接從原本的mysql目錄複製過去即可。
沒有留言:
張貼留言