如何使用C语言操作MySQL
沉沙 2018-05-17 来源 : 阅读 762 评论 0

摘要:本篇MySQL数据库教程讲解了如何使用C语言操作MySQL的操作步骤,希望阅读本文以后对大家学习MySQL数据库有所帮助。

连接

C语言连接MySQL包含两步:

· 初始化一个连接句柄

· 实际进行连接

    MYSQL *mysql_init(MYSQL *);
    //参数含义可查
    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);

Ex:

MYSQL *conn_ptr;
 
conn_ptr = mysql_init(NULL);if(!conn_ptr)
{
    ...//mysql_init failed
}
conn_ptr = mysql_real_connect(conn_ptr, "localhost", "rick", "secret", "foo", 0, NULL, 0);if(conn_ptr)
{
    ...//connection success
}else
{
    ...//connection failed
}

错误处理

 char *mysql_error(MYSQL *connection);
 unsigned int mysql_errno(MYSQL *connection);

Ex:

MYSQL *conn_ptr;
 
conn_ptr = mysql_init(NULL);if(!conn_ptr)
{
    ...//mysql_init failed
}
conn_ptr = mysql_real_connect(conn_ptr, "localhost", "rick", "secret", "foo", 0, NULL, 0);if(conn_ptr)
{
    ...//connection success
}else
{
    if(mysql_errno(conn_ptr))
    {
        fprintf(stderr, "Connection error %d: %s\n",mysql_errno(conn_ptr), mysql_error(conn_ptr));
    }
}

执行SQL语句

执行sql语句的主要API函数为:

//传入连接名和sql语句,成功返回0int mysql_query(MYSQL *connection, const char *query)

对sql语句的执行结果有两种情况:

· 不返回数据(UPDATE,DELETE,INSERT)

· 返回数据(SELECT)

不返回数据

这种情况较为简单,基本是只看成功与不成功

Ex:

MYSQL *conn_ptr;
...//初始化,连接数据库(省略)
 
res = mysql_query(conn_ptr, "INSERT INTO ... VALUES(...)");if(!res)
{
    ...//success
}else
{
    ...//error
}

返回数据的语句

一般需要四个步骤:

· 执行查询(mysql_query)

· 提取数据(mysql_use_result;mysql_store_result)

· 处理数据(mysql_fetch_row)

· 必要的清理工作(mysql_free_result)

执行查询

//传入连接名和sql语句,成功返回0int mysql_query(MYSQL *connection, const char *query)

提取数据

有两种提取数据函数:

· mysql_store_result(一次返回所有结果)

· mysql_use_result(一次返回一行数据)

在贴代码之前,还需要知道一个函数:mysql_fetch_row

//从mysql_store_result的结果中提取一行MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

Ex:(mysql_store_result)

MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
 
...//初始化,连接数据库(省略)
 
res = mysql_query(conn_ptr, "SELECT ... FROM...");if(res)
{
    ...//error
}else
{
    res_ptr = mysql_store_result(conn_ptr);
    if(res_ptr)
    {
        while((sqlrow = mysql_fetch_row(res_ptr)))
        {
            ...
        }
    }
    mysql_free_result(res_ptr);
}
mysql_close(conn_ptr);

处理数据

MySQL返回两种类型的数据:

· 从表中提取的信息,即列数据

· 数据的数据,即元数据,例如列名和类型等

mysql_field_count函数提供了一些关于查询结果的基本信息

Ex:

MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;   unsigned int field_count=0;
//初始化、连接、得到结果集(省略)
while((sqlrow = mysql_fetch_row(res_ptr)))
{
    while(field_count < mysql_field_count(conn_ptr))
    {
        printf("%s ", sqlrow[field_count]);
        field_count++;
    }
}

清理

· 关闭连接(mysql_close)

· 清内存(mysql_free_result)

API:

void mysql_close(MYSQL *connection);void mysql_free_result(MYSQL_RES *result);

例程

贴一个完整的代码:

#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; /* Used to ensure we display the row header exactly once when data is successfully retrieved */
 
 
   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) {
         fprintf(stderr, "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))) {
               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); /* Note on versions of MySQL before 4.0 the format should be %d, rather than %ld */
      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");
}


本文由职坐标整理并发布,了解更多内容,请关注职坐标数据库MySQL频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程