使用c语言访问mysql

用c语言连接MYSQL数据库包含两个步骤:
1.初始化一个链接句柄结构;
2.实际进行连接
首先,使用mysql_init来初始化连接句柄:
#include<mysql.h>
MYSQL *mysql_init(MYSQL *);
通常你传递NULL给这个例程,它会返回一个指向新分配的连接句柄结构的指针。如果你传递一个已有的结构,它将被重新初始化,
这个例程在出错是返回NULL。
目前为止,你知识分配和初始化一个结构,你还需要使用mysql_real_connect来向一个连接提供参数。
MYSQL *mysql_real_connect(MYSQL *connection , const char *server_host , 
const char *sql_user_name , const char * sql_password ,const char * db_name ,
 unsigned int port_number, const char *unix_socket_name , unsigned int flags);
指针connection必须指向已经被mysql_init初始化过的结构。
server_host既可以是主机名,也可以使IP地址。
sql_user_name 和sql_password的含义和它们的字面含义一样。如果登录名为NULL,则假设登录名为当前LINUX用户的登录ID,如果登录
密码为NULL,你将只能访问服务器上无需密码就可以访问的数据。
port_number和unix_socket_name应该分别是0和NULL,除非你改变了MYSQL安装的默认设置。它们将默认使用合适的值。
最后,flags参数用来对一些定义的位模式进行OR操作。
如果无法连接,它将返回NULL,mysql_error函数可以提供有帮助的信息。
使用完连接之后,通常程序退出时,你要像下面这样调用函数mysql_close();
void mysql_close(MYSQL *connection);
这将关闭连接。
mysql_option例程(仅能在mysql_init和mysql_real_connect之间调用)可以设置一些选项。
int mysql_option(MYSQL *connection , enum option_to_set , const char *argument);
因为mysql_option一次只能设置一个选项,所以设置一个选项就得调用它一次。
enum选项                                                实际参数类型                                        说明
MYSQL_OPT_TIMEOUT                       const unsigned int *                           连接超时之前等待的秒数
MYSQL_OPT_COMPRESS                  None,使用NULL                                 网络连接中使用压缩机制
MYSQL_OPT_COMMAND                    const char *                                         每次连接建立后发送的命令




执行sql语句
执行sql语句的主要API函数被恰当的命名为:
int mysql_query(MYSQL *connection ,const char *query);
如果成功返回0.
1.不返回数据的SQL语句
my_ulonglong mysql_affected_rows(MYSQL *connection);
返回值是无符号长整型,printf打印时,我们推荐使用%lu将其转换为无符号长整型。返回的是受之前的sql语句影响的行数。
 2.返回数据的语句
一次提取所有数据的函数
MYSQL_RES *mysql_store_result(MYSQL *connecion);
显然,你需要在在成功调用mysql_query之后使用这个函数。这个函数将立刻保存在客户端中返回的所有数据。
在mysql_store_result调用成功之后,你需要调用mysql_num_rows来得到返回记录的数目。
my_ulonglong mysql_num_rows(MYSQL_RES *RESULT);
这个函数接受由mysql_store_result返回的结构结构,并返回结构集中的行数。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
这个函数从使用mysql_store_result得到的结果结构中提取一行,并把它放到一个行结构中。当数据用完或发生错误时返回
NULL。
void mysql_data_seek(MYSQL_RES *result , my_ulonglong offset);
这个函数用来在结果集中进行跳转,设置将会被下一个mysql_fetch_row操作返回的行。参数offset的值是一个行号,它必须在
0到结果集总行数减1的范围内、
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
这个函数返回一个偏移值,它用来表示结果集中的当前位置。它不是一个行号,你不能把它用于mysql_data_seek
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result , MYSQL_ROW_OFFSET offset);
这将在结果集中移动当前位置,并返回之前的位置。
一次提取一行数据
MYSQL _RES *mysql_use_result(MYSQL *connection);


为了逐行提取数据,我们将要使用mysql_use_result而不是mysql_store_result
MYSQL_RES *mysql_use_result(MYSQL *connection);
mysql_field_count函数提供了一些关于查询结果的基本信息,它接受连接对象,并返回结果集中的字段(列)数目

unsigned int mysql_field_count(MYSQL *conneciton);


#include <stdlib.h>
#include <stdio.h>

#include "mysql.h"

MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;

void display_row();

int main(int argc, char *argv[]) {
   int res;

   mysql_init(&my_connection);  
   if (mysql_real_connect(&my_connection, "localhost", "rick", 
                                              "secret", "foo", 0, NULL, 0)) {
   printf("Connection success\n");
   
   res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");

   if (res) {
      printf("SELECT error: %s\n", mysql_error(&my_connection));
   } else {
      res_ptr = mysql_use_result(&my_connection);
      if (res_ptr) {
         while ((sqlrow = mysql_fetch_row(res_ptr))) {
            printf("Fetched data...\n");
	    display_row();
         }
         if (mysql_errno(&my_connection)) {
            printf("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;
}

void display_row() {
   unsigned int field_count;

   field_count = 0;
   while (field_count < mysql_field_count(&my_connection)) {
      printf("%s ", sqlrow[field_count]);
      field_count++;
   }
   printf("\n");
}




  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值