Mysql,是开源界很有名的数据库,LAMP这种组合也是在web服务器领域很流行.也就是说,我们经常用的API都是一些web编程语言如:php,java,pyhton这些语言来和mysql通信,但是要是用c语言呢,我也就小小的研究一下.
文章参考:
mysql中文手册在线版
mysql中文手册在线版
当你看完手册的时候,会发现,c语言也能像php一样
query = "select * from test";
mysql_query(query);
类似的语句,执行查询等数据库操作.但是C语言有一种更常用的方法,更好的方法.我们为什么用C,效率第一,所以看下面.
为什么要用预处理?
答:MySQL客户端/服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句,预处理执行是一种有效的方式。首先对语句进行解析,为执行作好准备。接下来,在以后使用初始化函数返回的语句句柄执行一次或多次。
对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量。
预处理语句的另一个优点是,它采用了二进制协议,从而使得客户端和服务器之间的数据传输更有效率。
下述语句可用作预处理语句:CREATE TABLE、DELETE、DO、INSERT、REPLACE、SELECT、SET、UPDATE、以及大多数SHOW语句。在MySQL 5.1中,不支持其他语句。
下面就把我的测试程序贴出来,是完成数据库的插入一条记录:
测试数据表结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | +------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------+----------------+ | USER_ID | int(11) | NO | PRI | NULL | auto_increment | | USERNAME | varchar(25) | NO | | NULL | | | PASSWORD | varchar(25) | NO | | NULL | | | ARK_GROUP_ID | int(11) | NO | | NULL | | | PURVIWE_GROUP_ID | int(11) | NO | | NULL | | | DESCRIPT | varchar(200) | YES | | | | | USER_POLICY | int(11) | YES | | 0 | | | MAIL | varchar(50) | YES | | | | | PHONE | varchar(15) | YES | | | | | LEVEL | int(1) | NO | | 0 | | +------------------+--------------+------+-----+---------+----------------+ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /************************************************************************************* * * Filename: mysqltest.h * Description: * * Version: 1.0 * Created: 2009年02月16日 16时15分20秒 * Revision: * Compiler: gcc * * Author: cyher (), cyher.net@gmail.com * Company: cyher.NET * **************************************************************************************/ #ifndef MYSQLTEST_H #define MYSQLTEST_H #define OK 0 #define ERROR -1 struct user_info { int ark_grp; int puv_grp; int level; char name[25]; char pswd[25]; }; int init_datebase(void); int my_insert(struct user_info * user); #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | ********************************************************** * * Filename: mysqltest.c * Description: mysql * * Version: 1.0 * Created: 2009年02月16日 15时19分39秒 * Revision: * Compiler: gcc * * Author: cyher (), cyher.net@gmail.com * Company: cyher.NET * ***********************************************************/ #include /* mysql库 */ #include #include #include #include "mysqltest.h" MYSQL my_sql; int init_datebase(void) { my_bool on = 1; mysql_init(&my_sql); /* MYSQL_OPT_RECONNECT如果发现连接丢失,启动或禁止与服务器的自动再连接。从MySQL 5.0.3 * 开始,默认情况下禁止再连接,这是5.0.13中的新选项, * 提供了一种以显式方式设置再连接行为的方法。 */ if ( 0 != mysql_options(&my_sql, MYSQL_OPT_RECONNECT, &on)) { printf( "Error set mysql_options for MYSOL_OPT_RECONNECT:%s\n", mysql_error(&my_sql) ); return (OK); } if (!mysql_real_connect(&my_sql,"localhost", "root", "123456789", "Grandi_Power",0,NULL,0)) { printf( "Error connecting to database: %s\n",mysql_error(&my_sql)); return(ERROR); } return(OK); } int my_insert(struct user_info * user) { MYSQL_STMT *stmt; MYSQL_BIND bind[5]; int user_name_len, user_pswd_len; my_ulonglong affected_rows; char *sql="insert into user (USERNAME,PASSWORD,ARK_GROUP_ID,PURVIWE_GROUP_ID,LEVEL) values(?,?,?,?,?)"; if (!(stmt = mysql_stmt_init(&my_sql))) return; memset(bind,0,sizeof(bind)); if(mysql_stmt_prepare(stmt, sql, strlen(sql))) { mysql_stmt_close(stmt); return ERROR; } user_name_len = strlen(user->name); user_pswd_len = strlen(user->pswd); bind[0].buffer_type = MYSQL_TYPE_VAR_STRING; bind[0].buffer = &(user->name); bind[0].buffer_length = 25; /* 最大长度 */ bind[0].is_null = 0; bind[0].length= (unsigned long *)&user_name_len; /* 实际长度的地址 */ bind[1].buffer_type = MYSQL_TYPE_VAR_STRING; bind[1].buffer = &(user->pswd); bind[1].buffer_length = 25; /* 最大长度 */ bind[1].is_null = 0; bind[1].length= (unsigned long *)&user_pswd_len; /* 实际长度的地址 */ bind[2].buffer_type = MYSQL_TYPE_LONG; bind[2].buffer = (char*)&(user->ark_grp); bind[2].is_null = 0; bind[2].length = 0; bind[3].buffer_type = MYSQL_TYPE_LONG; bind[3].buffer = (char*)&(user->puv_grp); bind[3].is_null = 0; bind[3].length = 0; bind[4].buffer_type = MYSQL_TYPE_LONG; bind[4].buffer = (char*)&(user->level); bind[4].is_null= 0; bind[4].length= 0; if (mysql_stmt_bind_param(stmt, bind)) { mysql_stmt_close(stmt); return ERROR; } if (mysql_stmt_execute(stmt)) { mysql_stmt_close(stmt); return ERROR; } affected_rows = mysql_stmt_affected_rows(stmt); if(1!=affected_rows) { mysql_stmt_close(stmt); return ERROR; } printf("INSERT SUCCEESFUL\n"); mysql_stmt_close(stmt); } int main(int argc, char **argv) { struct user_info user; strcpy(user.name,"haha"); strcpy(user.pswd,"ninini"); user.level = 4; user.ark_grp = 88822; user.puv_grp = 333; init_datebase(); my_insert(&user); return OK; } |
Makefile:
1 2 | mytest: mysqltest.c mysqltest.h gcc -o mytest mysqltest.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient |
近期评论