一、開發環境
ReadHat6.3 32位、mysql5.6.15、gcc4.4.6
二、編譯
gcc -I/usr/include/mysql
-L/usr/lib -lmysqlclient main.c -o main.out
-I:指定mysql頭文件所在目錄(默認去/usr/include目錄下尋找所用到的頭文件)
-L:指定mysql動態庫文件所在目錄(默認從/usr/lib目錄查找)
-l:鏈接libmysqlclient.so動態庫
-o:生成的可執行文件名
三、完整示例
// // main.c // mysql數據庫編程 // // Created by YangXin on 14-5-22. // Copyright (c) 2014年 yangxin. All rights reserved. // #include#include #include #include MYSQL mysql; // 查詢 int query(); // 修改 int update(); // 添加數據 my_ulonglong add(); // 參數化添加數據 my_ulonglong addByParams(); // 刪除數據 my_ulonglong delete(); // 打印數據庫服務器信息 void printMySqlInfo(); int main(int argc, const char * argv[]) { /*連接之前,先用mysql_init初始化MYSQL連接句柄*/ mysql_init(&mysql); /*使用mysql_real_connect連接服務器,其參數依次為MYSQL句柄,服務器IP地址, 登錄mysql的用戶名,密碼,要連接的數據庫等*/ if(!mysql_real_connect(&mysql, "localhost", "root", "yangxin", "test", 0, NULL, 0)) { printf("connecting to Mysql error:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql)); return -1; }else { printf("Connected Mysql successful!\n"); } printMySqlInfo(); // 設置編碼 mysql_query(&mysql, "set names utf8"); // 參數化添加數據 addByParams(); // 查詢 query(); // 修改 update(); // 添加 add(); // 刪除 delete(); /*關閉連接*/ mysql_close(&mysql); return 0; } // 查詢 int query() { int flag, i; const char *sql = NULL; MYSQL_RES *res = NULL; MYSQL_ROW row = NULL; MYSQL_FIELD *fields = NULL; sql = "select * from t_user" ; flag = mysql_real_query(&mysql, sql, (unsigned int)strlen(sql)); if (flag) { printf("query error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql)); return -1; } // 將查詢結果讀取到內存當中,如果數據很多的情況會比較耗內存 res = mysql_store_result(&mysql); // res = mysql_use_result(&mysql); // 需要用到的時候,每次從服務器中讀取一行 // 字段數量 unsigned int field_count = mysql_field_count(&mysql); printf("field_cout:%d\n",field_count); // 查詢總數 my_ulonglong rows = mysql_num_rows(res); printf("%lld\n",rows); // 獲取所有字段 fields = mysql_fetch_fields(res); for (int i = 0; i < mysql_num_fields(res); i++) { printf("%s\t", fields[i].name); } printf("\n"); // 遍歷結果集 while((row = mysql_fetch_row(res))) { for (i = 0; i < mysql_num_fields(res); i++) { printf("%s\t",row[i]); } printf("\n"); } // 釋放結果集 mysql_free_result(res); return 0; } // 修改 int update() { const char *sql = NULL; int flag = -1; sql = "update t_user set name='lisi',age=20 where id=1"; // 執行SQL指令 flag = mysql_real_query(&mysql, sql, (unsigned int)strlen(sql)); if (flag) { printf("update data error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql)); return -1; } printf("update success.\n"); return 0; } // 添加 my_ulonglong add() { const char *sql = NULL; int flag = -1; sql = "insert into t_user(name,age,address) values ('zhangsan',40,'beijing')"; // 執行 flag = mysql_real_query(&mysql, sql, strlen(sql)); if (flag) { printf("add data error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql)); return -1; } // 刪除的行數 my_ulonglong affected_rows = mysql_affected_rows(&mysql); // 新添加記錄的ID my_ulonglong newid = mysql_insert_id(&mysql); printf("success add %lld record data, newid:%lld!\n",affected_rows,newid); return newid; } // 參數化添加 my_ulonglong addByParams() { const char *sql = NULL; MYSQL_STMT *stmt = NULL; MYSQL_BIND bnd[3]; // 占位符參數數量 memset(&bnd, 0, sizeof(bnd)); // 設置手動提交事務 //mysql_autocommit(&mysql, 0); // 通過參數占位符的方式執行SQL sql = "insert into t_user(name,age,address) values (?,?,?)"; stmt = mysql_stmt_init(&mysql); // 預處理SQL if(mysql_stmt_prepare(stmt, sql, (unsigned int)strlen(sql))) { fprintf(stderr, "mysql_stmt_prepare faild:%d from %s\n", mysql_stmt_errno(stmt),mysql_stmt_error(stmt)); return -1; } // 封裝占位符數據 const char *name = "hanzhiqiang"; bnd[0].buffer = (void *)name; bnd[0].buffer_type = MYSQL_TYPE_STRING; bnd[0].buffer_length = strlen(name); int age = 30; bnd[1].buffer = (void *)&age; bnd[1].buffer_length = sizeof(int); bnd[1].buffer_type = MYSQL_TYPE_LONG; const char *addres = "heimuer"; bnd[2].buffer = (void *)addres; bnd[2].buffer_length = strlen(addres); bnd[2].buffer_type = MYSQL_TYPE_STRING; // 綁定占位符參數值 if(mysql_stmt_bind_param(stmt, bnd)) { fprintf(stderr, "mysql_stmt_bind_param faild:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql)); return -2; } // 執行SQL if (mysql_stmt_execute(stmt)) { fprintf(stderr, "mysql_stmt_execute faild:%d from %s\n", mysql_errno(&mysql), mysql_error(&mysql)); return -3; } // 關閉statement mysql_stmt_close(stmt); // 提交事務 //mysql_commit(&mysql); // 事務回滾(在提交事務前)執行 // mysql_rollback(&mysql); // 獲取插入數據後,數據庫受影響的記錄數 my_ulonglong newid = mysql_stmt_insert_id(stmt); printf("參數化語句插入新記錄的id: %lld\n",newid); // 受影響的行數 my_ulonglong affectedrows = mysql_stmt_affected_rows(stmt); printf("參數化語句插入受影響的行數:%lld\n",affectedrows); return newid; } my_ulonglong delete() { const char *sql = NULL; int flag = -1; sql = "delete from t_user where id > 10"; flag = mysql_real_query(&mysql, sql, strlen(sql)); if (flag) { printf("delete data error:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql)); return -1; } my_ulonglong affected_rows = mysql_affected_rows(&mysql); printf("刪除的行數:%lld\n",affected_rows); printf("success delete %lld record data !\n",affected_rows); return affected_rows; } void printMySqlInfo() { const char *stat = mysql_stat(&mysql); const char *server_info = mysql_get_server_info(&mysql); const char *clientInfo = mysql_get_client_info(); unsigned long version = mysql_get_client_version(); const char *hostinfo = mysql_get_host_info(&mysql); unsigned long serverversion = mysql_get_server_version(&mysql); unsigned int protoinfo = mysql_get_proto_info(&mysql); printf("stat:%s\n",stat); printf("server_info:%s\n",server_info); printf("clientInfo:%s\n",clientInfo); printf("version:%ld\n",version); printf("hostinfo:%s\n",hostinfo); printf("serverversion:%ld\n",serverversion); printf("protoinfo:%d\n",protoinfo); const char *charactername = mysql_character_set_name(&mysql); printf("client character set:%s\n",charactername); if (!mysql_set_character_set(&mysql, "utf8")) { printf("New client character set: %s\n", mysql_character_set_name(&mysql)); } }