1,使用c语言操作mysql之前,先在mysql里头创建一个数据库,一个表,在表里头添加数据如下: 创建数据库,库名为cusemysql: mysql>create database cusemysql; 创建表,表名为: mysql>use cusemysql; mysql>create table children(childno
int not null unique,fname varchar(20),age
int); 添加一点数据哦: mysql>insert into children values(5,
"花儿",10); 对拉,为了方便起见,把表的大致样子给大家看看 childno fname age 1 小星 9 2 大量 15 2 ,下面进行具体的操作 插入:insert 好的,我们现编辑一段c代码,取名为insert.c
#include <stdio.h> #include <stdlib.h> #include "/usr/include/mysql/mysql.h" ##locate mysql.h查找 int main(
int argc,
char *argv[]) { MYSQL my_connection;
int res; mysql_init(&my_connection);
if (mysql_real_connect(&my_connection,
"localhost",
"root",
"",
"cusemysql",0,NULL,CLIENT_FOUND_ROWS)) { printf(
"Connection success/n"); res = mysql_query(&my_connection,
"insert into children values(10,'Ann',5)");
if (!res) { printf(
"Inserted %lu rows/n",(unsigned
long)mysql_affected_rows(&my_connection)); }
else { fprintf(stderr,
"Insert error %d: %s/n",mysql_errno(&my_connection),mysql_error(&my_connection)); } mysql_close(&my_connection); }
else { fprintf(stderr,
"Connection failed/n");
if (mysql_errno(&my_connection)) { fprintf(stderr,
"Connection error %d: %s/n",mysql_errno(&my_connection),mysql_error(&my_connection)); } }
return EXIT_SUCCESS; } 代码写完了,要编译哦
#gcc -o insert insert.c -L /usr/lib/mysql/*.a -lz ##locate mysqlclient.a查找 ok,现在我们执行看看
#./insert Connection Success Inserted 1 rows year,果然可以,呵呵 不信到mysql下看看表children中是否多了刚才插入的那一行数据 注:也许你会问上面gcc的命令参数是什么意思阿,其实,我也不太清楚,呵呵 大概是要把mysql下的某个特定库包含进来,可是我不知道具体是个什么库,所以用*.a全部包含进来拉 其实只要包含mysqlclient.a就可以,你试试看 更新:update 我们只要把上面的代码中的 res = mysql_query(&my_connection,
"insert into children values(10,'Ann',5)"); 换成 res = mysql_query(&my_connection,
"update children set age=20 where childno<5 "); 即可 上面语句实现的功能是,把编号小于5的所有孩子的年龄全部改成20岁 检索:select 看代码之前,最好是先看蓝色字体的部分[介绍了代码中用到的一些函数的作用] /* select.c */
#include <stdio.h> #include <stdlib.h> #include "/usr/local/mysql/include/mysql/mysql.h" int main(
int argc,
char *argv[]) { MYSQL my_connection; MYSQL_RES *res_ptr; MYSQL_ROW sqlrow;
int res; mysql_init(&my_connection);
if (mysql_real_connect(&my_connection,
"localhost",
"root",
"",
"cusemysql",0,NULL,CLIENT_FOUND_ROWS)) { printf(
"Connection success/n"); res = mysql_query(&my_connection,
"select childno,fname,age from children where age<20");
if (res) { printf(
"SELECT error:%s/n",mysql_error(&my_connection)); }
else { res_ptr=mysql_store_result(&my_connection);
if(res_ptr) { printf(
"Retrieved %lu Rows/n",(unsigned
long)mysql_num_rows(res_ptr));
while((sqlrow=mysql_fetch_row(res_ptr))) { printf(
"Fetched data.../n"); }
if (mysql_errno(&my_connection)) { fprintf(stderr,
"Retrive error:%s/n",mysql_error(&my_connection)); } } mysql_free_result(res_ptr); } mysql_close(&my_connection); }
else { fprintf(stderr,
"Connection failed/n");
if (mysql_errno(&my_connection)) { fprintf(stderr,
"Connection error %d: %s/n", mysql_errno(&my_connection), mysql_error(&my_connection)); } }
return EXIT_SUCCESS; } 面语句实现的功能是:检索出年龄小于20岁的小孩的信息,不过没有对信息进行任何处理哦 下次我们对数据进行一定的处理 这里介绍上面用到的几个函数: 可以从SELECT语句(或其他返回数据的语句)中检索完所有数据,在单一调用中,使用mysql_store_result: MYSQL_RES *mysql_store_result(MYSQL *connection); 必须在mysql_query检索数据后才能调用这个函数,以在结果集中存储该数据。这个函数从服务器中检索所有数据并立即将它存储在客户机中。它返回一个指向以前我们从未遇到过的结构(结果集结构)的指针。如果语句失败,则返回NULL。 使用等价的PostgreSQL时,应该知道返回NULL意味着已经发生了错误,并且这与未检索到数据的情况不同。即使,返回值不是NULL,也不意味着当前有数据要处理。 如果未返回NULL,则可以调用mysql_num_rows并且检索实际返回的行数,它当然可能是0。 my_ulonglong mysql_num_rows(MYSQL_RES *result); 它从mysql_store_result取得返回的结果结构,并且在该结果集中返回行数,行数可能为0。如果mysql_store_result成功,则mysql_num_rows也总是成功的。 这 种mysql_store_result和mysql_num_rows的组合是检索数据的一种简便并且直接的方法。一旦 mysql_store_result成功返回,则所有查询数据都已经存储在客户机上并且我们知道可以从结果结构中检索它,而不用担心会发生数据库或网络 错误,因为对于程序所有数据都是本地的。还可以立即发现返回的行数,它可以使编码更简便。如前所述,它将所有结果立即地发送回客户机。对于大结果集,它可 能耗费大量的服务器、网络和客户机资源。由于这些原因,使用更大的数据集时,最好仅检索需要的数据。不久,我们将讨论如何使用 mysql_use_result函数来完成该操作。 一旦检索了数据,则可以使用mysql_fetch_row来检索它,并且使用mysql_data_seek、mysql_row_seek、mysql_row_tell操作结果集。在开始检索数据阶段之前,让我们先讨论一下这些函数。 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); 这个函数采用从存储结果中获取的结果结构,并且从中检索单一行,在行结构中返回分配给您的数据。当没有更多数据或者发生错误时,返回NULL。稍后,我们将回来处理这一行中的数据。
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset); 这个函数允许您进入结果集,设置将由下一个获取操作返回的行。offset是行号,它必须在从0到结果集中的行数减 1 的范围内。传递0将导致在下一次调用mysql_fetch_row时返回第一行。 MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *result); 这个函数返回一个偏移值,它表示结果集中的当前位置。它不是行号,不能将它用于mysql_data_seek。但是,可将它用于: MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset); 它移动结果集中的当前位置,并返回以前的位置。 有时,这一对函数对于在结果集中的已知点之间跳转很有用。请注意,不要将row tell和row seek使用的偏移值与data_seek使用的行号混淆。这些是不可交换的,结果将是您所希望看到的。
void mysql_free_result(MYSQL_RES *result); 完成结果集时, 必须总是调用这个函数,以允许MySQL库整理分配给它的对象。 检索并处理[比较全面哦,呵呵]:select 下面是详细的代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "/usr/local/mysql/include/mysql/mysql.h" int main(
int argc,
char *argv[]) { MYSQL my_connection; MYSQL_RES *res_ptr; MYSQL_ROW sqlrow; MYSQL_FIELD *fd;
char aszflds[25][25];
int res;
int i,j,k; mysql_init(&my_connection);
if (mysql_real_connect(&my_connection,
"localhost",
"root",
"",
"cusemysql",0,NULL,CLIENT_FOUND_ROWS)) { printf(
"Connection success/n"); res = mysql_query(&my_connection,
"select childno,fname,age from children where age<20");
if (res) { printf(
"SELECT error:%s/n",mysql_error(&my_connection)); }
else { res_ptr=mysql_store_result(&my_connection);
if(res_ptr) { printf(
"Retrieved %lu Rows/n",(unsigned
long)mysql_num_rows(res_ptr));
for(i=0;fd=mysql_fetch_field(res_ptr);i++) strcpy(aszflds[i],fd->name); printf(
"下面是检索出的各条记录信息:/n"); j=mysql_num_fields(res_ptr);
for(i=0;i<j;i++) printf(
"%s/t",aszflds[i]); printf(
"/n");
while((sqlrow=mysql_fetch_row(res_ptr))) {
for(i=0;i<j;i++) printf(
"%s/t",sqlrow[i]); printf(
"/n"); }
if (mysql_errno(&my_connection)) { fprintf(stderr,
"Retrive error:s/n",mysql_error(&my_connection)); } } mysql_free_result(res_ptr); } mysql_close(&my_connection); }
else { fprintf(stderr,
"Connection failed/n");
if (mysql_errno(&my_connection)) { fprintf(stderr,
"Connection error %d: %s/n", mysql_errno(&my_connection), mysql_error(&my_connection)); } }
return EXIT_SUCCESS; } 主要要注意的几个地方是: 1,mysql.h的路径,必须确定它的绝对路径哦(这句话是错误的,只要在编译是把对应库编译进去即可,具体操作方法请查询本博客) 2,注意你的数据库的用户名和密码是否正确 3,在编译的时候必须包含这个库文件mysqlclient.a[记不太清楚,不过你可以直接包含它所在的目录下的所有库,肯定就没有问题,