第20章 数据库函数库

  1. MySQL数据库函数

    1. 初始化一个连接句柄
        MYSQL *mysql_init(MYSQL *);
        正确:返回一个指向新分配的链接句柄结构的指针
        错误:NULL
        注:该函数的传入参数通常为NULL即可。


     


    2. 建立物理连接
        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值,如果连到本机,我们仅仅只需指定“localhost”即可。sql_user_name和sql_password即为访问数据库的用户名和密码,如果sql_user_name为空,那么默认为当前Linux user的用户名,如果sql_password为空,那么只能访问不需要密码的数据。密码在经网络传输之前都经过加密处理。通常情况下,如果你没有改变MySQL的默认安装,port_number和*unix_socket_name的值分别为0和NULL即可,他们默认为当前相应值。flags参数允许我们改变当前使用协议的特性,默认情况下,置0即可。
        如果连接不成功,该函数返回NULL


     


    3. 断开连接
        void mysql_close(MYSQL *connection);
        使用该函数可以断开指定的链接。不让不需要的连接断开会浪费资源,但重新建立连接需要额外开销,在实际工作中我们可根据需要权衡。


     


    4. 选项设置
        int mysql_options(MYSQL *connection, enum option_to_set,
     const char *argument);
        该函数可用在mysql_init和mysql_real_connect之间来设置一些连接选项,option_to_set参数如MYSQL_OPT_CONNECT_TIMEOUT用来设置连接超时的时间(秒),MYSQL_OPT_COMPRESS表示在网络传输中对数据进行压缩,而MYSQL_INIT_COMMAND指定每当连接建立时用来发送的命令。
        函数成功时返回0,因为该函数仅仅用来设置选项,所以失败意味着使用了无效的选项。此外,该函数每次只能设置一种选项,所以每设置一个选项就必须调用该函数一次。
       举例:
       unsigned int timeout = 7;
       connection = mysql_init(NULL);
       ret = mysql_options(connection, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&timeout);
       if (ret) {
     /* Handle error */
     ...
        }
        connection = mysql_real_connect(connection ...


     


    5. 错误处理
            unsigned int mysql_errno(MYSQL *connection);
            char *mysql_error(MYSQL *connection);
        错误代码为非0值
        举例:
            if (mysql_errno(&my_connection)) {
                 fprintf(stderr, “Connection error %d: %s/n”, mysql_errno(&my_connection),
                             mysql_error(&my_connection));


     


    6. 执行SQL命令
             int mysql_query(MYSQL *connection, const char *query)
        该函数用来执行SQL命令,如果执行成功则返回0。如果涉及二进制数据,可使用mysql_real_query这个函数


            my_ulonglong mysql_affected_rows(MYSQL *connection);
        该函数返回被update,insert,delete等查询命令影响的行数,返回值为unsigned Long(使用printf时需使用“lu"格式。当使用update命令时,该函数返回实际影响的行,而不是与where语句的匹配值(有些行已经是我们需要的那样,所以无需update)。如果我们希望该函数update的返回值与我们希望的那样,我们需要在mysql_real_connect函数中使用CLIENT_FOUND_ROWS flag,如
            if (mysql_real_connect(&my_connection, “localhost”,
     “rick”, “secret”, “foo”, 0, NULL, CLIENT_FOUND_ROWS)) {
        此外,当我们使用delete命令删除整个表时,此函数返回0。
        MySQL提供了LAST_INSERT_ID()函数来获取上次插入操作AUTO_INCREMENT列的数值,如SELECT LAST_INSERT_ID();即可在mysql_query函数中使用该语句。
       举例:
            res = mysql_query(&my_connection, “SELECT LAST_INSERT_ID()”);
           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(“We inserted childno %s/n”, sqlrow[0]);
                }
           mysql_free_result(res_ptr);
           }


     


    7. 数据控制
            MYSQL_RES *mysql_store_result(MYSQL *connection);
        该函数成功时返回一个指向返回集的指针,否则返回NULL。


            my_ulonglong mysql_num_rows(MYSQL_RES *result);
         该函数获取返回集中的行数,若为0表示没有返回行。


            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到rownum-1之间,当offset的值为0时,下一次用mysql_fetch_row取出的行就是返回集中的第一行。


            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);
        该函数用于移动返回集中指针的位置并返回先前的位置


           void mysql_free_result(MYSQL_RES *result);
        该函数用于释放返回集。


            MYSQL_RES *mysql_use_result(MYSQL *connection);
        该函数并不像mysql_store_result那样将数据存储到返回集中,而是返回一个返回集对象指针,所以你必须返回使用mysql_fetch_row取回数据,这对于大的数据集来说可以减少客户端的存储空间。此外,先前的mysql_data_seek,mysql_row_tell,mysql_row_seek也不能在此使用,mysql_num_rows函数只有在所有数据都被检索出后才能为我所用。


     


    8. 数据处理
     unsigned int mysql_field_count(MYSQL *connection);
        通常,该函数获取返回集中数据的列数。此外,我们还可以将该函数用于其它情况,比如说确定mysql_store_result函数失败的原因;如果mysql_store_result返回NULL,而mysql_filed_count返回了一个大于0的数,说明是检索错误,但如果mysql_field_count返回0,则表明为存储错误。


            MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
        该函数可获得与列字段相关信息的结构指针,包括如下等字段
            char  *name   列的名字
            char  *table   该列的表名,用于多表查询
            enum enum_field_types type 列的类型
            unsigned int length  列的宽度
            unsigned int max_length;  mysql_store_result返回集中列的最大长度字节
            unsigned int flags;  列的定义,包括NOT_NULL_FLAG, PRI_KEY_FLAG,
        UNSIGNED_FLAG, AUTO_INCREMENT_FLAG, and
        BINARY_FLAG.
            unsigned int decimals;  小数点后的位数


        常用的type有:
     FIELD_TYPE_DECIMAL
     FIELD_TYPE_LONG
     FIELD_TYPE_STRING
     FIELD_TYPE_VAR_STRING
        宏IS_NUM当参数字段为数字类型的时候返回TRUE,如
     if (IS_NUM(myslq_field_ptr->type)) printf(“Numeric type field/n”);


                MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,
      MYSQL_FIELD_OFFSET offset);
        设置mysql_fetch_field下一次取出列的位置,如果offset为0,下次将会取出第一列。


     


    9. 获取系统信息
         char *mysql_get_client_info(void);  返回客户端库文件的版本
         char *mysql_get_host_info(MYSQL *connection); 返回服务器连接信息
         char *mysql_get_server_info(MYSQL *connection);返回当前连接的服务器的信息
         char *mysql_info(MYSQL*connection);.  返回最近一次执行的query的信息,但只对update和     insert有效
         int mysql_select_db(MYSQL *connection,const char *dbname);改变当前连接的数据库,成功后返回0
         int mysql_shutdown(MYSQL *connection); 关闭数据库服务器,成功后返回0,前提是你有改     权限。


     


    10. 一个实例
        #include <stdlib.h>
        #include <stdio.h>
        #include “mysql.h”
        MYSQL my_connection;
        MYSQL_RES *res_ptr;


        MYSQL_ROW sqlrow;


        void display_header();
        void display_row();


        int main(int argc, char *argv[]) {
     int res;
     int first_row = 1;
     mysql_init(&my_connection);
     if (mysql_real_connect(&my_connection, “localhost”, “rick”,
      “bar”, “rick”, 0, NULL, 0)) {
     printf(“Connection success/n”);
     res = mysql_query(&my_connection, “SELECT childno, fname,
      age FROM children WHERE age > 5”);
     if (res) {
      fprintf(stderr, “SELECT error: %s/n”, mysql_error(&my_connection));
     } else {
      res_ptr = mysql_use_result(&my_connection);
      if (res_ptr) {
      display_header();
      while ((sqlrow = mysql_fetch_row(res_ptr))) {
       if (first_row) {
       display_header();
       first_row = 0;
      }
      display_row();
         }
         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;
        }


        void display_header() 
        {
         MYSQL_FIELD *field_ptr;
     printf(“Column details:/n”);
     while ((field_ptr = mysql_fetch_field(res_ptr)) != NULL) {
     printf(“/t Name: %s/n”, field_ptr->name);
     printf(“/t Type: “);
     if (IS_NUM(field_ptr->type)) {
      printf(“Numeric field/n”);
     } else {
      switch(field_ptr->type) {
      case FIELD_TYPE_VAR_STRING:
      printf(“VARCHAR/n”);
      break;
      case FIELD_TYPE_LONG:
      printf(“LONG/n”);
      break;
      default:
      printf(“Type is %d, check in mysql_com.h/n”, field_ptr->type);
      } /* switch */
     } /* else */
     printf(“/t Max width %ld/n”, field_ptr->length);
     if (field_ptr->flags & AUTO_INCREMENT_FLAG)
      printf(“/t Auto increments/n”);
      printf(“/n”);
      } /* while */
        }


        void display_row()
        {
     unsigned int field_count;
     field_count = 0;
     while (field_count < mysql_field_count(&my_connection)) {
      if (sqlrow[field_count]) printf(“%s “, sqlrow[field_count]);
      else printf(“NULL”);
      field_count++;
     }
     printf(“/n”);
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值