用C語言連接Mysql數據庫包含兩個步驟:
1 初始化一個連接句柄結構
2 實際進行連接
使用mysql_init來初始化連接句柄
#include <mysql.h>
MYSQL * mysql_init(MYSQL *);
通常你傳遞NULL給這個例程,它會返回一個指向新分配的連接句柄結構的指針。如果你傳遞一個已有的結構,它將被重新初始化。這個例程在出錯時返回NULL。
分配和初始化了一個結構,仍需要使用mysql_real_connect來向一個連接提供參數:
MYSQL * mysql_real_connect(MYSQL *connection,
const char * server_host,
const char * sql_user_name,
const char * sql_password,
const char * db_name,
unsigned int port_number,
const char * unix_socket_name,
unsigned int flags,);
connection:指向已經被mysql_init初始化過的結構
server_host:可以是主機名,也可以是ip地址。如果只是連接到本地機器,你可以通過指定localhost來優化連接類型。
sql_user_name:數據庫登錄名
sql_password:數據庫密碼
db_name:數據庫名
port_number:端口號(沒改變Mysql默認設置,使用0表示默認值)
unix_socket_name:為NULL表示默認值
flags:用來對一些定義的位模式進行OR操作,使得改變使用協議的某些特性。
void mysql_close(MYSQL *connection);
關閉連接。如果連接是由mysql_init建立的,MySQL結構會被釋放。指針將會失效並無法再次使用。保留一個不需要的連接是對資源的浪費,但是重新打開連接也會帶來額外的開銷,所以必須自己權衡何時使用這些選項。
mysql_options(僅能在mysql_init和mysql_real_connect之間調用)
int mysql_options(MYSQL *connection,enum option_to_set,const char *argument);
因為mysql_options一次只能設置一個選項,所以每設置一個選項就得調用它一次。你可以多次調用,只要它出現在mysql_init和mysql_real_connect之間即可。
列出3個最常用的選項,如下:
enum選項實際參數類型說明MySQL_OPT_CONNECT_TIMEOUTconst unsigned int *連接超時之前的等待秒數MySQL_OPT_COMPRESS使用NULL網絡連接中使用壓縮機制MySQL_INIT_COMMANDconst char * 每次連接建立後發送的命令一次成功的調用返回0。
以用戶名root和密碼yao來連接本機服務器上名為test的數據庫
connect.c
#include <stdlib.h> #include <stdio.h> #include "mysql.h" int main(int argc,char **argv) { MYSQL * conn_ptr; conn_ptr = mysql_init(NULL); if(!conn_ptr) { perror("mysql_init failed\n"); exit(1); } conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","yao","test",0,NULL); if(conn_ptr) { printf("connection success\n"); } else { printf("connection failed\n"); } mysql_close(conn_ptr); return 0; }
編譯這個程序,需要同時添加include路徑和庫文件路徑,以及指定鏈接的庫模塊mysqlclient。
gcc -I/usr/include/mysql connect.c -L/usr/lib/mysql -lmysqlclient -o connect
可能的錯誤:
Centos 6.4 64位系統下使用C語言訪問Mysql 找不到mysqlclient
解決:
將 -L/usr/lib/mysql改為 -L/usr/lib64/mysql
錯誤處理
MySQL使用一系列由連接句柄結構報告的返回碼。
unsigned int mysql_errno(MYSQL * connection);
char * mysql_error(MYSQL * connection);
通過調用mysql_errno並傳遞連接結構來獲得錯誤碼,通常都是非0值。如果未設定錯誤碼,它將返回0。因為每次調用庫都會更新錯誤碼,所以你只能得到最後一個執行命令的錯誤碼。上面兩個錯誤檢查函數是例外,它們不會導致錯誤碼的更新。
mysql_errno的返回值實際上就是錯誤碼,它們在頭文件errmsg.h或mysqld_error.h中定義。這兩個文件都可以在MySQL的include目錄中找到。前者報告客戶端錯誤,後者關注服務端錯誤。
如果喜歡文本信息錯誤,調用mysql_error,提供了有意義的文本信息,這些信息被寫入一些內部靜態內存空間中。
使用非動態分配的連接結構
#include <stdlib.h> #include <stdio.h> #include "mysql.h" int main(int argc,char **argv) { MYSQL mysql_conn; mysql_init(&mysql_conn); if(mysql_real_connect(&mysql_conn,"localhost","root","dfdsfjfd","test",0,NULL)) { printf("connection success\n"); mysql_close(&mysql_conn); } else { perror("connection failed\n"); if(mysql_errno(&mysql_conn)) { fprintf(stderr,"connection error %d:%s\n",mysql_errno(&mysql_conn),mysql_error(&mysql_conn)); } } return 0; }
注:這裡我使用動態分配的連接結構,錯誤信息不產生。
執行SQL語句
執行SQL語句的函數為
int mysql_query(MYSQL *connection,const char *query);
這個函數接受連接結構指針和文本字符串形式的有效SQL語句(沒有結束的分號)。如果成功,返回0.對於包含二進制數據的查詢,可以使用第二個函數mysql_real_query。
1 不返回數據的SQL語句
不返回任何數據的SQL語句:update delete insert
這裡介紹另一個重要函數,用於檢查首查詢影響的行數
my_ulonglong mysql_affected_rows(MYSQL *connection);
這個函數的返回值類型很不常見,它使用無符號類型。當你使用printf時,推薦使用%lu格式將其轉換為無符號長整數。這個函數返回受之前執行的update、insert或delete查詢影響的行數。如果你使用過其他SQL數據庫,MySQL返回的是被一個更新操作修改的行數,但許多其他數據庫將僅僅因為記錄匹配where子句就把它視為已經更新過。
插入一條數據
#include <stdlib.h> #include <stdio.h> #include "mysql.h" int main(int argc,char **argv) { MYSQL mysql_conn; int res; mysql_init(&mysql_conn); if(mysql_real_connect(&mysql_conn,"localhost","root","yao","test",0,NULL)) { printf("connection success\n"); res = mysql_query(&mysql_conn,"insert into child(childid,age,name) values (1,12,'bing')"); if(!res) { printf("inserted %lu rows\n",(unsigned long)mysql_affected_rows(&mysql_conn)); } else { fprintf(stderr,"insert error %d:%s",mysql_errno(&mysql_conn),mysql_error(&mysql_conn)); } mysql_close(&mysql_conn); } else { fprintf(stderr,"connection failed\n"); if(mysql_errno(&mysql_conn)) { fprintf(stderr,"Connection error %d:%s\n",mysql_errno(&mysql_conn),mysql_error(&mysql_conn)); } } return 0; }
今天先到這,下次繼續補充。。。
本文出自 “技術在於堅持” 博客,請務必保留此出處http://minilinux.blog.51cto.com/4499123/1300703