linux下c语言操作mysql[转]

下来的时候赶紧找资料,刚才搜索了几下,终于找到一些:
1,[比较详细]在 C 里嵌入 SQL:http://www.pgsqldb.org/pgsqldoc-7.4/ecpg.html
2,[在MySQL数据库中使用C执行SQL语句]:http://www.dvbbs.net/tech/data/2006031818989.asp
3,MySQL客户工具和API:http://www.yesky.com/imagesnew/software/mysql/manual_Clients.html
4,基于mysql的高性能数据库应用开发:http://cache.baidu.com/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:

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/local/mysql/include/mysql/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/local/mysql/lib/mysql

#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[记不太清楚,不过你可以直接包含它所在的目录下的所有库,肯定就没有问题,

各方意见:

一.
编译方法有点不规范。

正确的应该是这样:


1.在程序开头包含头文件应这样写:

#include <mysql.h>

2.编译应这样写:


$ gcc -o mysql $(mysql_config --cflags) mysql.c $(mysql_config --libs)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值