C语言中使用mysql函数库
最近有个项目,要求用C语言连接mysql数据库,苦找了半天才找要一些相关的API,写下来和大家一起分享。 我用的是linux操作系统(debian 4.0 sid),所在在安装mysql库时十分方便,使用下的几条命令轻松搞定。大家一起来看看吧。 sudo apt-get install mysql-server-5.0 sudo apt-get insta
最近有个项目,要求用C语言连接mysql数据库,苦找了半天才找要一些相关的API,写下来和大家一起分享。
我用的是linux操作系统(debian 4.0 sid),所在在安装mysql库时十分方便,使用下的几条命令轻松搞定。大家一起来看看吧。
sudo apt-get install mysql-server-5.0
sudo apt-get install libmysqlclient15-dev
为了确保mysql.h(没有它是不行的哦!)这个文件安装完成,使用如下命令查看一下:
ls -l /usr/include/mysql/mysql.h
如出现如下类似信息,说明我们所需要的头文件已经安装成功,可以开始写程序了。
-rw-r--r-- 1 root root 33759 2007-05-19 08:16 /usr/include/mysql/mysql.h
好了,不多说废话了,让我们开始吧。
首先要了解与mysql的一些库函数,我们可以到以下的网址去查找(相当多的库函数啊!!!)。
http://www.linuxforum.net/books/mysqlmanual/manual_toc.html(Mysql中文参考手册) 或者http://dev.mysql.com/doc/refman/5.1/zh/apis.html(Mysql 5.1中文参考手册 推荐)
现在我们启动mysql,创建数据库及表。
mysql -h xxx.xxx.xxx.xxx. -u root -p (回车确认,在提示下输入密码,成功后进入数据库)
创建数据库
create database mytest;
创建表
create table hotelwebmanager(ROOM_ON int,IP char(15),POWERON_TIME datetime);
只是为了练习而建的数据库及表,所以结构比较简单。
为了练习一下用C语言写mysql的程序,我们先一个小试验,此程序的目的是连接一个已有的数据库。
/*connect_db.c*/
#include<stdio.h>
#include<mysql/mysql.h>
int main(int argc,char *argv[])
{
MYSQL mysql;
char *hostname="localhost";
char *username="root";
char *password="000000";
char *dbname="mytest";
mysql_init(&mysql);
if(!mysql_real_connect(&mysql,hostname,username,password,mytest,0,NULL,0))
{
printf("connect database fail !!!\n");
}
else
{
printf("connect database successful !!!\n");
}
}
现在我们开始编译上面的程序,gcc connect_db.c -lmysqlclient
要想对数据进行以上这些操作的话,就要了解一些基本的操作函数,下面是这些函数的介绍 和示例。
1、mysql_real_query
原型:int mysql_real_query(MYSQL *mysql,const char *qurey,unsigned int length)
功能:执行SQL语句。
参数:MYSQL *mysql 该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。不应尝试拷贝MYSQL结构。不保证这类拷贝结果会有用。
const *qurey 对数据库操作的SQL语句(没有SQL语句中应有的语句结束符号,即“;”)。例如:select * from tablename
unsigned int length 操作语句的字符串长度。
返回值:操作成功返回0,否则返回非0。
示例:
int i;
MYSQL mysql;
char *sql="select * from hotelwebmanager";
if((i=mysql_real_qurey(&mysql,sql,strlen(sql)))!=0)
{
printf("successful!!!\n");
mysql_close(&mysql); //close database
exit(0); //return 0
}
else
{
printf("fail!!!\n");
mysql_close(&mysql); //close database
exit(1); //return 1
}
可是这样并不是把查询的结果显示出来,而只是将查询语句传给数据库,这一点可以从些函数的返回值上看出。如果要想把真正的查询结果显示出来的话,还要继续、耐心的学习。在这一节的最后还会有一个完整的示例,不要急哦!
2、mysql_store_result
原型:MYSQL_RES *mysql_store_result(MYSQL *mysql)
功能:得到查询的结果集。对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
参数:MYSQL *mysql 同mysql_real_qurey
返回值:MYSQL_RES 该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。也将查询返回的信息称为“结果集”。
示例:
MYSQL_RES *result;
if(result=mysql_store_result(&mysql))!=NULL)
printf("result is not NULL\n");
else
printf("resutl is NULL\n");
3、mysql_num_rows
原型:my_ulonglong mysql_num_rows(MYSQL_RES *result)
功能:返回查询结果的行数。mysql_num_rows()的使用取决于是否采用了mysql_store_result()或mysql_use_result()来返回结果集。如果使用了mysql_store_result(),可以立刻调用mysql_num_rows()。如果使用了mysql_use_result(),mysql_num_rows()不返回正确的值,直至检索了结果集中的所有行为止。
参数:MYSQL_RES *result 由mysql_store_result返回的结果集。
返回值:my_ulonglong 用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型。该类型提供的范围为0~1.84e19。在某些系统上,不能打印类型my_ulonglong的值。要想打印这类值,请将其转换为无符号长整数类型并使用%lu打印格式,例如:
printf("Number of rows %lu\n",(unsigned long)mysql_num_rows(result));
4、mysql_num_fields
原型:unsigned int mysql_num_fields(MYSQL_RES *result)
功能:返回查询结果集的列数。
参数:同上
返回值:无符号整数。
示例:
int i;
i=mysql_num_fields(result);
printf("%u",i);
5、mysql_fetch_row
原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
功能:检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
返回值:下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
6、mysql_free_result
原型:void mysql_free_result(MYSQL_RES *result)
功能:释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。释放完成后,不要尝试访问结果集。
返回值:无
好了,有了以上这些函数,就可以从表中查询数据了,看一具体的例子吧。
/*select.c*/
#include<stdio.h>
#include<mysql/mysql.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
MYSQL mysql;
MYSQL_ROW row;
MYSQL_RES *result;
int data_cols;
char *host_name="127.0.0.1";
char *db_name="mytest";
char *user_name="root";
char *password="000000";
char *select_arg="select * from hotelwebmanager";
if(mysql_init(&mysql)==NULL)
{
printf("init error !\n");
exit(1);
}
if(!mysql_real_connect(&mysql,host_name,user_name,password,db_name,0,NULL,0))
{
printf("connect database error !\n");
exit(1);
}
if(mysql_real_query(&mysql,select_arg,strlen(select_arg))!=0)
{
printf("query error !\n");
exit(1);
}
if((result=mysql_store_result(&mysql))!=NULL)
{
data_cols=mysql_num_fields(result);
while(row=mysql_fetch_row(result))
{
int cols;
for(cols=0;cols<data_cols;cols++)
{
printf("%s ",row[cols]);
}
printf("\n");
}
printf("\n");
mysql_free_result(result);
mysql_close(&mysql);
}
}
更多推荐
所有评论(0)