c语言程序如何链接到数据库,c语言如何链接到数据库

转载自:http://abirdofparadise.blog.hexun.com/8900253_d.html

#include  

#include  

void   main(){

MYSQL   *mysql;

MYSQL_RES   *res;

MYSQL_ROW   row;

char   *query;

int   t,r;

mysql_init(mysql);

if   (!mysql_real_connect(mysql,"localhost","mysql",

"mysql","deneme",0,NULL,0))

{

printf(   "Error   connecting   to   database:   %s/n",mysql_error(mysql));

}

else   printf("Connected.../n");

query="select   *   from   Deneme";

t=mysql_real_query(mysql,query,(unsigned   int)   strlen(query));

if   (t)

{

printf("Error   making   query:   %s/n",

mysql_error(mysql));

}

else   printf("Query   made.../n");

res=mysql_use_result(mysql);

for(r=0;r<=mysql_field_count(mysql);r++){

row=mysql_fetch_row(res);

if(row<0)   break;

for(t=0;t

printf("%s   ",row[t]);

}

printf("/n");

}

mysql_close(mysql);

}

简介

C   APIs包含在mysqlclient库文件当中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询。有一些例子在MySQL原代码的clients目录里。

MySQL   C   变量类型

以下变量类型在MySQL的库当中定义。我们需要这些变量是为了使用MySQL的函数。这些变量有详细的解释,但是这些解释对于写代码来说并不重要。

MYSQL

以下代码块是用来连接数据库的通讯过程

typedef   struct   st_mysql   {

NET                       net;                         /*   Communication   parameters   */

gptr                     connector_fd;       /*   ConnectorFd   for   SSL   */

char                     *host,*user,*passwd,*unix_socket,

*server_version,*host_info,*info,*db;

unsigned   int     port,client_flag,server_capabilities;

unsigned   int     protocol_version;

unsigned   int     field_count;

unsigned   int     server_status;

unsigned   long   thread_id;             /*   Id   for   connection   in   server   */

my_ulonglong   affected_rows;

my_ulonglong   insert_id;               /*   id   if   insert   on   table   with   NEXTNR   */

my_ulonglong   extra_info;                             /*   Used   by   mysqlshow   */

unsigned   long   packet_length;

enum   mysql_status   status;

MYSQL_FIELD       *fields;

MEM_ROOT             field_alloc;

my_bool               free_me;                 /*   If   free   in   mysql_close   */

my_bool               reconnect;             /*   set   to   1   if   automatic   reconnect   */

struct   st_mysql_options   options;

char                     scramble_buff[9];

struct   charset_info_st   *charset;

unsigned   int     server_language;

}   MYSQL;

MYSQL_RES

这段代码返回查询结果的行。返回的数据称为“数据集”

typedef   struct   st_mysql_res   {

my_ulonglong   row_count;

unsigned   int     field_count,   current_field;

MYSQL_FIELD       *fields;

MYSQL_DATA         *data;

MYSQL_ROWS         *data_cursor;

MEM_ROOT             field_alloc;

MYSQL_ROW           row;                         /*   If   unbuffered   read   */

MYSQL_ROW           current_row;         /*   buffer   to   current   row   */

unsigned   long   *lengths;               /*   column   lengths   of   current   row   */

MYSQL                   *handle;                 /*   for   unbuffered   reads   */

my_bool               eof;                         /*   Used   my   mysql_fetch_row   */

}   MYSQL_RES;

MYSQL_ROW

这个结构是数据行的一个安全表示法。你无法使用以空字符结束的串,因为数据在这个串可以是二进制,   也许没有包括任何字符。

typedef   struct   st_mysql_field   {

char   *name;                                       /*   Name   of   column   */

char   *table;                                     /*   Table   of   column   if   column   was   a   field   */

char   *def;                                         /*   Default   value   (set   by   mysql_list_fields)   */

enum   enum_field_types   type;       /*   Type   of   field.   Se   mysql_com.h   for   types   */

unsigned   int   length;                     /*   Width   of   column   */

unsigned   int   max_length;             /*   Max   width   of   selected   set   */

unsigned   int   flags;                       /*   Div   flags   */

unsigned   int   decimals;                 /*   Number   of   decimals   in   field   */

}   MYSQL_FIELD;

my_ulonglong

该类型用于行数,mysql_affected_rows()   、mysql_num_rows()和mysql_insert_id()   。该类型提供范围0   到1.84.e19   的支持。在一些系统,   试图打印出my_ulonglong类型的值是不行的.要显示这样的值,   使用%lu   printf   格式,把它转换成unsigned   long类型就行了。例如:

printf(Number   of   rows:   %lu/n",   (unsigned   long)   mysql_num_rows(result));

typedef   unsigned   long   my_ulonglong;

连接MySQL,查询数据

现在假设MySQL已安装,   用户和数据表在数据库被创造。以防有什么不明问题的情况,   请参考www.mysql.com   网站。

前面已经说过,MySQL的库文件在mysqlclient。因此在编译MySQL程序的时候有必要加上-lmysqlclient编译选项。MySQL的头文件在/usr/include/mysql目录下(根据Linux的发行版本的不同,这个目录也有所不同),因此你的程序头部看起来有点这个样子:

#include  

MySQL的变量类型和函数都包含在这个头文件当中

然后,我们需要创建连接数据库的变量,可以简单地这么做:

MYSQL   *mysql;

在连接数据库之前,我们要调用以下函数初始化这个变量:

mysql_init(MYSQL   *mysql)

然后

MYSQL   *   STDCALL   mysql_real_connect(MYSQL   *mysql,

const   char   *host,

const   char   *user,

const   char   *passwd,

const   char   *db,

unsigned   int   port,

const   char   *unix_socket,

unsigned   int   clientflag);

该函数被调用连接到数据库。host是MySQL服务器的主机名,user是登录的用户名,passwd是登录密码,db是要连接的数据库,port是MySQL服务器的TCP/IP端口,unix_socket是连接类型,clientflag是MySQL运行成ODBC数据库的标记。在这篇文章当中该标记设成0,连接寻建立后,这个函数返回0。

现在可以连接数据库,进行查询了:

char   *query;

使用这个字符串我们可以创立任何SQL查询语句进行查询。执行这个查询的函数是:

int   STDCALL   mysql_real_query(MYSQL   *mysql,

const   char   *q,

unsigned   int   length);

mysql是我们前面用过的变量,q是SQL查询语句,length是这个查询语句的长度。如果查询成功,函数返回0。

查询之后,我们要到一个MYSQL_RES变量来使用查询的结果。以下这行创立这个变量:

MYSQL_RES   *res;

然后

mysql_use_result(MYSQL   *query)

该函数读出查询结果。

尽管可以很容易地查询了,要用这个查询的结果还要用到其它的函数。第一个是:

MYSQL_ROW   STDCALL   mysql_fetch_row(MYSQL_RES   *result);

该函数把结果转换成“数组”。你可能注意到了,该函数返回的是MYSQL_ROW变量类型。以下语句创立那样的变量:

MYSQL_ROW   row;

如前所解释的,变量row是一个字符串数组。也就是说,row[0]是数组的第一个值,row[1]是数组的第二个值...当我们用mysql_fetch_row的时候,接着变量row会取得结果的下一组的数据。当到了结果的尾部,该函数返回一负值。最后我们要关闭这个连接:

mysql_close(MYSQL   *mysql)

一些有用的函数

看看如何取得一个表格的字段,以下这个函数可能实现这个功能:

unsigned   int   STDCALL   mysql_num_fields(MYSQL   *mysql);

这个函数返回表格里有多少个字段。

取得“数据集”的数目,用:

my_ulonglong   STDCALL   mysql_num_rows(MYSQL_RES   *res);

my_ulonglong   STDCALL   mysql_affected_rows(MYSQL   *mysql);

这个函数是用来得到受INSERT,   DELETE,   UPDATE查询语句影响的“数据集”数目。注意该函数返回的数据类型是my_ulonglong

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值