MySQL使用C語言連接完整代碼樣例
一:MySQL connect
?? MySQL 的基礎,我們之前已經學過,后面我們只關心使用
要使用 C 語言連接 MySQL,需要使用 MySQL 官網提供的庫,大家可以去官網下載
我們使用 C接口庫來進行連接
要正確使用,我們需要做一些準備工作:
- 保證 mysql 服務有效
- 在官網上下載合適自己平臺的 MySQL connect 庫,以備后用
- 建議直接使用命令
sudo yum install -y mysql-community-server
安裝
Connector / C 使用
- ?? 我們下下來的庫格式如下:
# tree /usr/include/mysql /usr/include/mysql ├── client_plugin.h ├── errmsg.h ├── field_types.h ├── my_command.h ├── my_compress.h ├── my_list.h ├── mysql_com.h ├── mysqld_error.h ├── mysql.h ├── mysql_time.h ├── mysql_version.h ├── mysqlx_ername.h ├── mysqlx_error.h ├── mysqlx_version.h ├── plugin_auth_common.h └── udf_registration_types.h lib # find /usr -name "libmysqlclient*" /usr/share/doc/libmysqlclient21 /usr/share/doc/libmysqlclient-dev /usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40 /usr/lib/x86_64-linux-gnu/libmysqlclient.a /usr/lib/x86_64-linux-gnu/libmysqlclient.so /usr/lib/x86_64-linux-gnu/libmysqlclient.so.21
其中 include 包含所有的方法聲明, lib 包含所有的方法實現(xiàn)(打包成庫)
嘗試鏈接 mysql client
通過
mysql_get_client_info()
函數(shù),來驗證我們的引入是否成功
#include <iostream> #include <mysql/mysql.h> int main() { std::cout << "mysql client version: " << mysql_get_client_info() << std::endl; return 0; } $ g++ -o mytest test.cc -std=c++11 -lmysqlclient $ ls Makefile mytest test.cc $ ./mytest mysql client version: 8.0.40
至此引入庫的工作已經做完,接下來就是熟悉接口
mysql 接口介紹
初始化 mysql_init()
要使用庫,必須先進行初始化!
初始化一個 MYSQL對象 MYSQL *mysql_init(MYSQL *mysql); 使用 mysql_init函數(shù)初始化一個 MySQL 連接句柄,為后續(xù)操作做準備。 如: MYSQL *mfp = mysql_init(NULL)
鏈接數(shù)據庫 mysql_real_connect
初始化完畢之后,必須先鏈接數(shù)據庫,在進行后續(xù)操作。(mysql網絡部分是基于TCP / IP的)
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); //建立好鏈接之后,獲取英文沒有問題,如果獲取中文是亂碼: //設置鏈接的默認字符集是utf8,原始默認是latin1 mysql_set_character_set(myfd, "utf8");
第一個參數(shù) MYSQL是 C api 中一個非常重要的對象(mysql_init的返回值),里面內存非常豐富,有
port, dbname, charset 等連接基本參數(shù)。它也包含了一個叫 st_mysql_methods 的結構體變量,該變量里面保存著很多函數(shù)指針,這些函數(shù)指針將會在數(shù)據庫連接成功以后的各種數(shù)據操作中被調用。
mysql_real_connect 函數(shù)中各參數(shù),基本都是顧名思意。
測試:
#include <iostream> #include <unistd.h> #include <string> #include <mysql/mysql.h> const std::string host = "127.0.0.1"; const std::string user = "connector"; const std::string passwd = "123456"; const std::string db = "conn"; const unsigned int port = 3306; int main() { std::cout << "mysql client version: " << mysql_get_client_info() << std::endl; MYSQL* my = mysql_init(nullptr); if(my == nullptr) { std::cerr << "init MySQL error" << std::endl; return 1; } if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) { std::cerr << "connect MYSQL error" << std::endl; return 2; } std::cout << "connect success" << std::endl; mysql_set_character_set(my, "utf8"); // 設置字符集 mysql_close(my); return 0; }
結果:
# ./mytest mysql client version: 8.0.40 connect success
下發(fā) mysql 命令 mysql_query
int mysql_query(MYSQL *mysql, const char *q);
第一個參數(shù)上面已經介紹過,第二個參數(shù)為要執(zhí)行的sql語句,如“select * from table”。
獲取執(zhí)行結果 mysql_store_result sql 執(zhí)行完以后,如果是查詢語句,我們當然還要讀取數(shù)據,如果 update,insert 等語句,那么就看下操作成功與否即可。
#include <iostream> #include <unistd.h> #include <string> #include <mysql/mysql.h> const std::string host = "127.0.0.1"; const std::string user = "connector"; const std::string passwd = "123456"; const std::string db = "conn"; const unsigned int port = 3306; int main() { std::cout << "mysql client version: " << mysql_get_client_info() << std::endl; MYSQL* my = mysql_init(nullptr); if(my == nullptr) { std::cerr << "init MySQL error" << std::endl; return 1; } if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) { std::cerr << "connect MYSQL error" << std::endl; return 2; } std::cout << "connect success" << std::endl; mysql_set_character_set(my, "utf8"); // 設置字符集 std::string sql; while(true) { std::cout << "MySQL>>> "; if(!std::getline(std::cin, sql) || sql == "quit") { std::cout << "bye bye" << std::endl; break; } int n = mysql_query(my, sql.c_str()); if(n == 0) { std::cout << sql << " success: " << n << std::endl; } else { std::cerr << sql << " failed" << n << std::endl; } } mysql_close(my); return 0; }
我們來看看如何獲取查詢結果: 如果 mysql_query 返回成功,那么我們就通過 mysql_store_result 這個函數(shù)來讀取結果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
該函數(shù)會調用 MYSQL 變量中的 st_mysql_methods 中的 read_rows 函數(shù)指針來獲取查詢的結果。同時該函數(shù)會返回 MYSQL_RES 這樣一個變量,該變量主要用于保存查詢的結果。同時該函數(shù) malloc 了一片內存空間來存儲查詢過來的數(shù)據,所以我們一定要記的 free(result), 不然是肯定會造成內存泄漏的。 執(zhí)行完 mysql_store_result 以后,其實數(shù)據都已經在 MYSQL_RES 變量中了,下面的 api 基本就是讀取 MYSQL_RES 中的數(shù)據。
獲取結果行數(shù) mysql_num_rows
獲取結果列數(shù) mysql_num_fields
獲取列名 mysql_fetch_fields
如:
int fields = mysql_num_fields(res); MYSQL_FIELD *field = mysql_fetch_fields(res); for(int i = 0; i < fields; i++) { cout<<field[i].name<<" "; }
獲取結果內容mysql_fetch_row
它會返回一個MYSQL_ROW變量,MYSQL_ROW其實就是char **. 就當成一個二維數(shù)組來用吧
MYSQL_ROW line; for(i = 0; i < nums; i++) { line = mysql_fetch_row(res); for(int j = 0; j < fields; j++) { cout << line[j] << " "; } }
完整代碼樣例
#include <iostream> #include <unistd.h> #include <string> #include <mysql/mysql.h> const std::string host = "127.0.0.1"; const std::string user = "connector"; const std::string passwd = "123456"; const std::string db = "conn"; const unsigned int port = 3306; int main() { std::cout << "mysql client version: " << mysql_get_client_info() << std::endl; MYSQL* my = mysql_init(nullptr); if(my == nullptr) { std::cerr << "init MySQL error" << std::endl; return 1; } if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) { std::cerr << "connect MYSQL error" << std::endl; return 2; } std::cout << "connect success" << std::endl; mysql_set_character_set(my, "utf8"); // 設置字符集 //std::string sql = "update user set name='Jimmy' where id=2"; //std::string sql = "insert into user (name, age, telphone) values ('peter', 19, 6543219876)"; std::string sql = "select * from user"; int n = mysql_query(my, sql.c_str()); if(n == 0) std::cout << sql << " success" << std::endl; else { std::cerr << sql << " failed" << std::endl; return 3; } MYSQL_RES *res = mysql_store_result(my); if(res == nullptr) { std::cerr << "mysql_store_result error" << std::endl; return 4; } my_ulonglong rows = mysql_num_rows(res); my_ulonglong fields = mysql_num_fields(res); std::cout << "行: " << rows << std::endl; std::cout << "列: " << fields << std::endl; // 屬性 MYSQL_FIELD *fields_array = mysql_fetch_fields(res); for(int i = 0; i < fields; i++) { std::cout << fields_array[i].name << '\t'; } std::cout << '\n'; // 內容 for(int i = 0; i < rows; i++) { MYSQL_ROW row = mysql_fetch_row(res); // mysql_fetch_row相當于一個迭代器,會自動向后遍歷 MYSQL_ROW 就是一個 char** 的二級指針 for(int j = 0; j < fields; j++) { std::cout << row[j] << '\t'; } std::cout << '\n'; } mysql_free_result(res); mysql_close(my); return 0; }
?? 關閉 mysql 鏈接 mysql_close
void mysql_close(MYSQL *sock);
?? 另外,mysql C api 還支持事務等常用操作,大家下來自行了解:
my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); my_bool STDCALL mysql_commit(MYSQL * mysql); my_bool STDCALL mysql_rollback(MYSQL * mysql);
或者直接通過query函數(shù)直接操作都可以
總結
到此這篇關于MySQL使用C語言連接的文章就介紹到這了,更多相關MySQL使用C語言連接內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL安全配置向導mysql_secure_installation詳解
這篇文章主要介紹了MySQL安全配置向導mysql_secure_installation各項配置的含義,并依據經驗給予一了一些建議,需要的朋友可以參考下2014-03-03