




免费预览已结束,剩余5页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux下c语言学习笔记操作mysqlBy falcon 2006年3月30日晚上完成版权声明:可以自由转载,但是必须保留原作者名和本站地址,谢谢/blog/article.php?tid_45.html今天上数据库的时候刚上到嵌入式sql,感觉非常有意思,上课的时候就想反正做搜索引擎要用到c连接mysql数据库的,到底是怎么实现?想入非非,呵呵.下来的时候赶紧找资料,刚才搜索了几下,终于找到一些:1,比较详细在 C 里嵌入 SQL:/pgsqldoc-7.4/ecpg.html2,在MySQL数据库中使用C执行SQL语句:/tech/data/2006031818989.asp3,MySQL客户工具和API:/imagesnew/software/mysql/manual_Clients.html4,基于mysql的高性能数据库应用开发:/c?word=mysql%3B%5F%3Breal%3B%5F%3Bconnect%2C%B2%CE%CA%FD&url=http%3A/www%2Edaima%2Ecom%2Ecn/Info/76/Info27780/&b=0&a=2&user=baidu大家一起来开始练习罗注:下面的所有例子在mandriva linux下测试通过1,使用c语言操作mysql之前,先在mysql里头创建一个数据库,一个表,在表里头添加数据如下:创建数据库,库名为cusemysql:mysqlcreate database cusemysql;创建表,表名为:mysqluse cusemysql;mysqlcreate table children(childno int not null unique,fname varchar(20),age int);添加一点数据哦:mysqlinsert into children values(5,花儿,10);对拉,为了方便起见,把表的大致样子给大家看看childno fname age1 小星 92 大量 152 ,下面进行具体的操作插入:insert 好的,我们现编辑一段c代码,取名为insert.c/* insert.c */#include #include #include /usr/local/mysql/include/mysql/mysql.h/*注意哦,上面必须是mysql.h的绝对地址,一般在mysql下的include目录下,仔细看看你的在哪里?*/int main(int argc, char *argv)MYSQL my_connection;int res;mysql_init(&my_connection);/*mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) = NULL)*/if (mysql_real_connect(&my_connection, localhost, root, ,cusemysql,0,NULL,CLIENT_FOUND_ROWS) printf(Connection successn); res = mysql_query(&my_connection, insert into children values(10,Ann,5); if (!res) printf(Inserted %lu rowsn,(unsigned long)mysql_affected_rows(&my_connection);/*里头的函数返回受表中影响的行数*/ else /分别打印出错误代码及详细信息fprintf(stderr, Insert error %d: %sn,mysql_errno(&my_connection),mysql_error(&my_connection); mysql_close(&my_connection);else fprintf(stderr, Connection failedn); if (mysql_errno(&my_connection) fprintf(stderr, Connection error %d: %sn,mysql_errno(&my_connection),mysql_error(&my_connection); return EXIT_SUCCESS;/代码写完了,要编译哦#gcc -o insert insert.c -L /usr/local/mysql/lib/mysql/*.a -lzok,现在我们执行看看#./insertConnection SuccessInserted 1 rowsyear,果然可以,呵呵不信到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 childno5 );即可上面语句实现的功能是,把编号小于5的所有孩子的年龄全部改成20岁检索:select看代码之前,最好是先看蓝色字体的部分介绍了代码中用到的一些函数的作用/* select.c */#include #include #include /usr/local/mysql/include/mysql/mysql.hint main(int argc, char *argv)MYSQL my_connection;MYSQL_RES *res_ptr;MYSQL_ROW sqlrow;int res;mysql_init(&my_connection);/*mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) = NULL)*/if (mysql_real_connect(&my_connection, localhost, root, ,cusemysql,0,NULL,CLIENT_FOUND_ROWS) printf(Connection successn); res = mysql_query(&my_connection, select childno,fname,age from children where age20); if (res) printf(SELECT error:%sn,mysql_error(&my_connection); else res_ptr=mysql_store_result(&my_connection); if(res_ptr) printf(Retrieved %lu Rowsn,(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:%sn,mysql_error(&my_connection); mysql_free_result(res_ptr); mysql_close(&my_connection);else fprintf(stderr, Connection failedn); if (mysql_errno(&my_connection) fprintf(stderr, Connection error %d: %sn, 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 下面是详细的代码:/* select1.c */#include #include #include #include /usr/local/mysql/include/mysql/mysql.hint main(int argc, char *argv)MYSQL my_connection;MYSQL_RES *res_ptr; /*指向检索的结果存放地址的指针*/MYSQL_ROW sqlrow; /*返回的记录信息*/MYSQL_FIELD *fd; /*字段结构指针*/char aszflds2525; /*用来存放各字段名*/int res; /*执行查询操作后的返回标志*/int i,j,k;mysql_init(&my_connection);/*mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) = NULL)*/if (mysql_real_connect(&my_connection, localhost, root, ,cusemysql,0,NULL,CLIENT_FOUND_ROWS) printf(Connection successn); res = mysql_query(&my_connection, select childno,fname,age from children where agename); /*输出各条记录*/ printf(下面是检索出的各条记录信息:n); j=mysql_num_fields(res_ptr); for(i=0;ij;i+) printf(%st,aszfldsi); printf(n); while(sqlrow=mysql_fetch_row(res_ptr) for(i=0;ij;i+) printf(%st,sqlrowi); printf(n); if (mysql_errno(&my_connec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汉中公路声屏障施工方案
- 心理咨询室搬迁方案
- 秀山酒店铝单板施工方案
- 成品铝合金门施工方案
- 幼儿园图书展活动方案策划
- 培训班体育活动方案策划
- 屋面墙角防水施工方案
- 冬奥会有关的活动策划方案
- 中华企业咨询兑付方案
- 2025年金属制品行业新材料应用创新研究报告
- (高清版)JTGT 3365-01-2020 公路斜拉桥设计规范
- 专业技术人员年度考核情况登记表
- GB/T 33285.2-2024皮革和毛皮烷基酚及烷基酚聚氧乙烯醚的测定第2部分:间接法
- 2023年贵州专升本英语真题试卷(完整版)
- 医院护理培训课件:《成人早期预警评分系统介绍》
- 2023保密知识测试题库含答案
- 危险化学品安全作业(氧化工艺)考试题库(含答案)
- 中国农业银行笔试题库(含答案)
- GA 1808-2022军工单位反恐怖防范要求
- 工程建设项目绿色建造施工水平评价申请表
- 液压基础知识培训课件
评论
0/150
提交评论