Windows环境下Code::Blocks中成功配置MySQL Connector/C连接MySQL数据库
下面我將介紹當需要用C語言開發(fā)能訪問MySQL數(shù)據(jù)庫的程序時成功配置的關(guān)鍵事項。
操作系統(tǒng):Windows 7 x64
編程環(huán)境:Code::Blocks 10.05(32bit)
配置方式說明:用C語言開發(fā)訪問MySQL數(shù)據(jù)庫至少有3種配置方式。
? ? ? ? ?方式1:使用MySQL Connector/C二進制發(fā)行版,在運行C語言開發(fā)環(huán)境的機器中只用MySQL Connector/C,不安裝MySQL Server。這種方式的適用場合是:本機不需要安裝龐大的MySQL Server程序,我們的C語言程序訪問的數(shù)據(jù)庫服務(wù)器程序在遠程的某個主機上(通過網(wǎng)絡(luò)能訪問到它),數(shù)據(jù)庫服務(wù)器程序不在本機。這種是輕量級方式。此時MySQL Connector/C 提供了頭文件mysql.h,靜態(tài)鏈接庫mysqlclient.lib,動態(tài)鏈接庫libmysql.dll。此外還提供了當需要動態(tài)鏈接庫時的靜態(tài)導(dǎo)入庫libmysql.lib。
? ? ? ? 方式2:使用MySQL Connector/C二進制發(fā)行版,在運行C語言開發(fā)環(huán)境的機器中不裝MySQL Connector/C,但安裝了MySQL Server。這種方式的使用場合是:需要訪問的目標數(shù)據(jù)庫就在本機,因此本機安裝了MySQL Server。這種方式的Code::Blocks環(huán)境配置與方式1相同,只是mysql.h所在的include目錄以及l(fā)ibmysql.lib,libmysql.dll所在的lib目錄的路徑在MySQL Server的安裝目錄下。
? ? ? ? 以上兩種方式中,如果是你使用的是MySQL Connector/C Community版,則需要預(yù)先安裝Microsoft?Visual C++ Redistributable forVisual Studio 2015,至于是安裝x64版還是x86版,需要看你計算機的配置情況而定。
? ? ? ?方式3:使用MySQL Connector/C的源代碼。將此源代碼與你的C程序源代碼一起編譯。這種方式過程比較繁瑣,具體可參考MySQL官網(wǎng)相關(guān)文檔:https://dev.mysql.com/doc/connector-c/en/connector-c-installation-source.html
本文介紹的安裝方式為方式1。
關(guān)鍵步驟和注意事項:
(1)在MySQL官網(wǎng)上下載MySQL Connector/C的二進制發(fā)行版的zip包。請注意版本為win32版,不要下載winx64版。建議不下載msi包,因為該包是自動解壓的Program File或Program File(x86)目錄的MySQL目錄下,還不如自己解壓到指定目錄。
(2)將以上下載的mysql-connector-c-*.*.*-win32.zip壓縮包解壓到指定的文件夾。本例中解壓在“C:\MySQL Connector C 6.1 for Win X32”目錄下。
(3)新建Code::Blocks項目。
(4)配置編譯時頭文件mysql.h所在位置,配置鏈接時所需的libmysql.lib,libmysql.dll所在位置。單擊Code::Blocks菜單“Project”-->"Build Options..."。彈出如下窗口。請選擇左邊框中的"Debug",這表示本項目的“Debug”配置。
然后,設(shè)置需要連接的庫文件所在位置。選擇“Linker Settings”選項卡,單擊“Add”按鈕,選擇剛才解壓的MySQL Connectors/C壓縮包解壓后目錄中的lib目錄下的libmysql.lib。單擊“確定”后,如下圖所示。
如果這一步?jīng)]有配置后,在編譯時,將提示無法解析程序中的MySQL API函數(shù)。
然后,設(shè)置include目錄和lib目錄作為搜索路徑。首先,單擊“Search directories”選顯卡的“Compiler”子選項卡,單擊“Add”將MySQ ?Connector/C解壓目錄下的include 目錄添進來。這是mysql.h頭文件所在位置。
如果程序運行時出現(xiàn)編譯時找不到MySQL API中的函數(shù)的錯誤,那一定是此步驟的mysql.h頭文件所在的include 目錄的位置沒有配置好。
接下來,請單擊“Search directories”選顯卡的“Linker”子選項卡,單擊“Add”將MySQ ?Connector/C解壓目錄下的lib 目錄添進來。這是libmysql.dll動態(tài)鏈接庫文件所在位置。雖然靜態(tài)鏈接庫文件libmysql.lib也在此文件,但是這個靜態(tài)鏈接庫在“Linker Settings”中已經(jīng)進行了設(shè)置。
如果程序的編譯通過了,但是運行時出現(xiàn)如下錯誤,那么一定是因為此步驟中l(wèi)ibmysql.dll的搜索位置沒有設(shè)置好。
請用如下代碼測試:
#include <stdio.h>
#include <winsock2.h> //因為要進行網(wǎng)絡(luò)連接
#include <mysql.h> //因為使用了MySQL C API訪問mysql數(shù)據(jù)庫
int main() {
? ? MYSQL mysql; //mysql數(shù)據(jù)庫連接
? ? mysql_init(&mysql);//初始化mysql連接
? ? char host[]="192.168.0.123";//MYSQL服務(wù)器的主機名或IP,本機為localhost
? ? char user[]="user";//mysql數(shù)據(jù)庫登錄的用戶名
? ? char passwd[]="123456";//mysql數(shù)據(jù)庫登錄的密碼
? ? char db[]="mydatabase";//要連接的數(shù)據(jù)庫名
? ? unsigned int port=3306;//MySQL服務(wù)器的TCP/IP端口號,默認為3306
? ? char *unixSocket=NULL;//連接類型
? ? unsigned int clientFlag=CLIENT_FOUND_ROWS;//MySQL運行ODBC數(shù)據(jù)庫的標記
? ? MYSQL_RES *res_ptr; //指向查詢結(jié)果的指針
? ? MYSQL_FIELD *field; //指向字段結(jié)構(gòu)體的指針
? ? MYSQL_ROW result_row; //按行返回的select結(jié)果,即一行記錄。
? ? int rowCnt, colCnt; //select結(jié)果返回的記錄行數(shù)和列數(shù)
? ? int res; //執(zhí)行sql語句后的返回標志
? ? int i, j;
? ? //建立mysql連接
? ? if (NULL != mysql_real_connect(&mysql,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?host,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?user,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?passwd,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?db,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?port,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?unixSocket,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?clientFlag)) {
? ? ? ? //連接成功
? ? ? ? printf("數(shù)據(jù)庫連接成功!\n");
? ? ? ? //設(shè)置查詢編碼為gbk,以支持中文
? ? ? ? mysql_query(&mysql, "set names gbk");
? ? ? ? char *sql;
? ? ? ? sql="select * from users"; //請改為對自己數(shù)據(jù)的表進行查詢的SQL語句。
? ? ? ? res = mysql_query(&mysql, sql);
? ? ? ? if (res) { //執(zhí)行查詢語句失敗
? ? ? ? ? ? printf("查詢語句執(zhí)行失敗 !\n");
? ? ? ? ? ? //關(guān)閉連接
? ? ? ? ? ? mysql_close(&mysql);
? ? ? ? } else { //查詢語句執(zhí)行成功
? ? ? ? ? ? //將查詢的結(jié)果賦值給res_ptr
? ? ? ? ? ? res_ptr = mysql_store_result(&mysql);
? ? ? ? ? ? //如果記錄集不為空,就把每條記錄按行輸出
? ? ? ? ? ? if (res_ptr) {
? ? ? ? ? ? ? ? //取得結(jié)果記錄集的行數(shù)和字段數(shù)
? ? ? ? ? ? ? ? rowCnt = mysql_num_rows(res_ptr);
? ? ? ? ? ? ? ? colCnt = mysql_num_fields(res_ptr);
? ? ? ? ? ? ? ? printf("查詢到 %d 行 \n", rowCnt);
? ? ? ? ? ? ? ? //輸出記錄的字段名
? ? ? ? ? ? ? ? for (i = 0; field = mysql_fetch_field(res_ptr); i++)
? ? ? ? ? ? ? ? ? ? printf("%10s ", field->name);
? ? ? ? ? ? ? ? printf("\n");
? ? ? ? ? ? ? ? //按行輸出每條記錄
? ? ? ? ? ? ? ? for (i = 1; i < rowCnt+1; i++) {
? ? ? ? ? ? ? ? ? ? result_row = mysql_fetch_row(res_ptr);
? ? ? ? ? ? ? ? ? ? for (j = 0; j < colCnt; j++)
? ? ? ? ? ? ? ? ? ? ? ? printf("%10s ", result_row[j]);
? ? ? ? ? ? ? ? ? ? printf("\n");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //最后,不再使用數(shù)據(jù)庫時,請不要忘了關(guān)閉連接,釋放資源。
? ? ? ? ? ? mysql_close(&mysql);
? ? ? ? }
? ? } else {
? ? ? ? printf("數(shù)據(jù)庫連接失敗!");
? ? }
? ? return 0;
}
有兩個層面上的測試。
第一層測試,Code::Blocks是否能正常編譯使用MySQL Connector/C API的代碼。
第二層測試:數(shù)據(jù)庫是否能被程序代碼正常訪問。
如果以上代碼能夠正常運行,那就恭喜你,配置和鏈接成功了。
如果程序編譯通過了,但是在運行時出現(xiàn)如下錯誤,
那么極有可能是MySQL API與所需的VC++2015Resdistribute 的版本不匹配。
經(jīng)過驗證,正確的匹配模式是:
32的gcc編譯器?
MySQL Connector/C32位的x86版
VC++2015Resdistribute32位的x86版
以上組合就沒有問題。其他組合,可能有問題。
總結(jié)
以上是生活随笔為你收集整理的Windows环境下Code::Blocks中成功配置MySQL Connector/C连接MySQL数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Office Word界面和页面字体模糊
- 下一篇: spring jdbctemplate