初學MySQL,記錄一下MySQL用c語言編程時遇到的問題。
這是我的源程序:
1 int main(void) 2 { 3 MYSQL *mysql=NULL; 4 5 6 if((mysql=mysql_init(mysql))==NULL) 7 { 8 fprintf(stderr,"Cannot initialize MySQL"); 9 return 1; 10 } 11 if(mysql_real_connect(mysql,"localhost","kerry","beck123",NULL,0,NULL,0)==NULL) 12 { 13 fprintf(stderr,"%d:%s \n",mysql_errno(mysql),mysql_error(mysql)); 14 return 1; 15 } 16 printf("Succeed!\n"); 17 return 0; 18 }
MySQL的c API有幾個重要的數據類型:
-
MYSQL
該結構代表1個數據庫連接的句柄。幾乎所有的MySQL函數均使用它。不應嘗試拷貝MYSQL結構。不保證這類拷貝結果會有用
-
該結構代表返回行的查詢結果(SELECT, SHOW, DESCRIBE, EXPLAIN)。在本節的剩余部分,將查詢返回的信息稱為“結果集”。
-
這是1行數據的“類型安全”表示。它目前是按照計數字節字符串的數組實施的。(如果字段值可能包含二進制數據,不能將其當作由Null終結的字符串對待,這是因為這類值可能會包含Null字節)。行是通過調用mysql_fetch_row()獲得的。
-
該結構包含關於字段的信息,如字段名、類型和大小。這里詳細介紹了其成員。通過重復調用mysql_fetch_field(),可為每個字段獲得MYSQL_FIELD結構。字段值不是該結構的組成部份,它們包含在MYSQL_ROW結構中。
-
這是MySQL字段列表偏移量的“類型安全”表示(由mysql_field_seek()使用)。偏移量是行內的字段編號,從0開始。
聲明“MYSQL *mysql=NULL;“,必須為該指針賦值為NULL。如果定義為"MYSQL *mysql;",不為該指針賦值,就會生成野指針,程序運行時會發生“段錯誤 (核心已轉儲)“錯誤。
“野指針”不是NULL指針,是指向“垃圾”內存(不可用內存)的指針。人們一般不會錯用NULL指針,因為用if語句很容易判斷。但是“野指針”是很危險的,if無法判斷一個指針是正常指針還是“野指針”。有個良好的編程習慣是避免“野指針”的唯一方法。
調用mysql_init()函數,該函數會分配或初始化與mysql_real_connect()相適應的MYSQL對象。如果mysql是NULL指針,該函數將分配、初始化、並返回新對象。否則,將初始化對象,並返回對象的地址。如果mysql_init()分配了新的對象,當調用mysql_close()來關閉連接時。將釋放該對象。