Linux下使用C语言访问MySQL数据库(三):访问实现代码

时间:2022-03-23 00:15:10

1.前言

1.1声明

文章中的文字可能存在语法错语以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

关于数据库的基本概念和MySQL数据库的安装可以参看我这篇文章:
https://blog.csdn.net/wangqingchuan92/article/details/80404275

2.代码实现

2.1下载MySQL库

在使用C语言开发访问数据库代码之前,需要下载MySQL开发库:
在终端输入指令:sudo apt-get install libmysqlclient15-dev
Linux下使用C语言访问MySQL数据库(三):访问实现代码

完成安装后,在/usr/include/mysql中含有使用C语言操作MySQL所需要的头文件库:mysql.h。

2.2建立一个测试用数据库

本例中,新建一个名为“testdb”的数据库,数据库中新建一个名为“children”的表,表的内容包括编号、儿童姓名、年龄:
Linux下使用C语言访问MySQL数据库(三):访问实现代码
Linux下使用C语言访问MySQL数据库(三):访问实现代码
Linux下使用C语言访问MySQL数据库(三):访问实现代码

具体关于创建一个数据库可以参看这篇文章:
https://blog.csdn.net/wangqingchuan92/article/details/80417941

2.3连接到数据库

在数据库和表建好以后,编写如下代码,测试是否能连接上该数据库:

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

MYSQL *conn_ptr;
unsigned int timeout = 7;   //超时时间7秒
int main()
{
    int ret = 0;
    conn_ptr = mysql_init(NULL);//初始化
    if(!conn_ptr)
    {
        printf("mysql_init failed!\n");
        return -1;
    }

    ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
    if(ret)
    {
        printf("Options Set ERRO!\n");
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
    if(conn_ptr)
    {
        printf("Connection Succeed!\n");
        mysql_close(conn_ptr);
        printf("Connection closed!\n");
    }
    else    //错误处理
    {
        printf("Connection Failed!\n");
        if(mysql_errno(conn_ptr))
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }
        return -2;
    }

    return 0;
}

代码编译后,出现如下显示则表明连接至MySQL数据库成功:
Linux下使用C语言访问MySQL数据库(三):访问实现代码

2.4输入数据到表

测试连接成功后,使用mysql_query函数在数据库的表中插入数据,本例中,插入(ann,3)数据至表,代码如下:

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

MYSQL *conn_ptr;
unsigned int timeout = 7;   //超时时间7秒
int main()
{
    int ret = 0;
    conn_ptr = mysql_init(NULL);//初始化
    if(!conn_ptr)
    {
        printf("mysql_init failed!\n");
        return -1;
    }

    ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
    if(ret)
    {
        printf("Options Set ERRO!\n");
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
    if(conn_ptr)
    {
        printf("Connection Succeed!\n");

        ret = mysql_query(conn_ptr,"INSERT INTO children(fname,age) VALUES('ann',3)"); //执行SQL语句
        if(!ret)
        {
            printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(conn_ptr));//返回上次UPDATE更改行数
        }
        else
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }

        mysql_close(conn_ptr);
        printf("Connection closed!\n");
    }
    else    //错误处理
    {
        printf("Connection Failed!\n");
        if(mysql_errno(conn_ptr))
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }
        return -2;
    }

    return 0;
}

编译代码:
Linux下使用C语言访问MySQL数据库(三):访问实现代码
对比执行代码前后的数据库状态:
Linux下使用C语言访问MySQL数据库(三):访问实现代码
Linux下使用C语言访问MySQL数据库(三):访问实现代码

2.4检索数据库表中数据

连接到数据库后,可以进行数据检索工作,数据检索可以使用mysql_store_result或mysql_use_result,取决于怎样检索数据,其次使用mysql_fetch_row来处理数据。最后,使用mysql_free_result允许MySQL进行必要的整理工作。本例中,要测试的数据库中表有三条记录数据。

2.4.1使用mysql_store_result方法检索

代码如下:

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

MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;   //超时时间7秒
int main()
{
    int ret = 0;
    conn_ptr = mysql_init(NULL);//初始化
    if(!conn_ptr)
    {
        printf("mysql_init failed!\n");
        return -1;
    }

    ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
    if(ret)
    {
        printf("Options Set ERRO!\n");
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
    if(conn_ptr)
    {
        printf("Connection Succeed!\n");

        ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于5岁的孩子
        if(!ret)
        {
            res_ptr = mysql_store_result(conn_ptr);
            if(res_ptr)
            {
                printf("Retrieved %lu rows\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
                while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
                {
                    printf("Fetched data\n");
                }
            }

            if(mysql_errno(conn_ptr))
            {
                printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
                return -2;
            }

            mysql_free_result(res_ptr);
        }
        else
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
            return -3;
        }

        mysql_close(conn_ptr);
        printf("Connection closed!\n");
    }
    else    //错误处理
    {
        printf("Connection Failed!\n");
        if(mysql_errno(conn_ptr))
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }
        return -2;
    }

    return 0;
}

编译及运行:
Linux下使用C语言访问MySQL数据库(三):访问实现代码

2.4.2使用mysql_use_result方法检索

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

MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;   //超时时间7秒
int main()
{
    int ret = 0;
    conn_ptr = mysql_init(NULL);//初始化
    if(!conn_ptr)
    {
        printf("mysql_init failed!\n");
        return -1;
    }

    ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
    if(ret)
    {
        printf("Options Set ERRO!\n");
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
    if(conn_ptr)
    {
        printf("Connection Succeed!\n");

        ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于5岁的孩子
        if(!ret)
        {
            res_ptr = mysql_use_result(conn_ptr);
            if(res_ptr)
            {
                printf("Retrieved %lu rows\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
                while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
                {
                    printf("Fetched data\n");
                }
            }

            if(mysql_errno(conn_ptr))
            {
                printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
                return -2;
            }

            mysql_free_result(res_ptr);
        }
        else
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
            return -3;
        }

        mysql_close(conn_ptr);
        printf("Connection closed!\n");
    }
    else    //错误处理
    {
        printf("Connection Failed!\n");
        if(mysql_errno(conn_ptr))
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }
        return -2;
    }

    return 0;
}

编译及运行:
Linux下使用C语言访问MySQL数据库(三):访问实现代码

2.5处理检索数据

在得到检索数据后,应该进行检索数据处理工作,本例中,将检索出来的数据打印出来:

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

MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;   //超时时间7秒

void dispaly_row(MYSQL *ptr)
{
    unsigned int field_count = 0;
    while(field_count<mysql_field_count(ptr))
    {
        printf("%s",sqlrow[field_count]);
        field_count++;
    }
    printf("\n");
}
int main()
{
    int ret = 0;
    conn_ptr = mysql_init(NULL);//初始化
    if(!conn_ptr)
    {
        printf("mysql_init failed!\n");
        return -1;
    }

    ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
    if(ret)
    {
        printf("Options Set ERRO!\n");
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
    if(conn_ptr)
    {
        printf("Connection Succeed!\n");

        ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于5岁的孩子
        if(!ret)
        {
            res_ptr = mysql_use_result(conn_ptr);
            if(res_ptr)
            {
                printf("Retrieved %lu rows\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
                while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
                {
                    printf("Fetched data\n");
                    dispaly_row(conn_ptr);
                }
            }

            if(mysql_errno(conn_ptr))
            {
                printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
                return -2;
            }

            mysql_free_result(res_ptr);
        }
        else
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
            return -3;
        }

        mysql_close(conn_ptr);
        printf("Connection closed!\n");
    }
    else    //错误处理
    {
        printf("Connection Failed!\n");
        if(mysql_errno(conn_ptr))
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }
        return -2;
    }

    return 0;
}

编译及运行结果:
Linux下使用C语言访问MySQL数据库(三):访问实现代码
上例中没有考虑在结果中可能出现的NULL值,若要在一个更加结构化的表单中得到数据及关于数据信息,使用mysql_fetch_field函数实现:

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

MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;   //超时时间7秒

void dispaly_row(MYSQL *ptr)
{
    unsigned int field_count = 0;
    while(field_count<mysql_field_count(ptr)) //返回在结果结合中字段的数目
    {
        printf("%s",sqlrow[field_count]);
        field_count++;
    }
    printf("\n");
}

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("VACHAR\n");
                    break;
                case FIELD_TYPE_LONG:
                    printf("LONG\n");
                    break;
                default:
                    printf("Type is %d,check in mysql_com.h\n",field_ptr->type);
            }
        }
        printf("\t Max width %ld \n",field_ptr->length);
        if(field_ptr->flags & AUTO_INCREMENT_FLAG)
            printf("\t Auto increments\n");
        printf("\n");
    }
}
int main()
{
    int ret = 0;
    int first_row = 1;
    conn_ptr = mysql_init(NULL);//初始化
    if(!conn_ptr)
    {
        printf("mysql_init failed!\n");
        return -1;
    }

    ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
    if(ret)
    {
        printf("Options Set ERRO!\n");
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
    if(conn_ptr)
    {
        printf("Connection Succeed!\n");

        ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于5岁的孩子
        if(!ret)
        {
            res_ptr = mysql_use_result(conn_ptr);
            if(res_ptr)
            {
                display_header();
                printf("Retrieved %lu rows\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
                while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
                {
                    dispaly_row(conn_ptr);
                }
            }

            if(mysql_errno(conn_ptr))
            {
                printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
                return -2;
            }

            mysql_free_result(res_ptr);
        }
        else
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
            return -3;
        }

        mysql_close(conn_ptr);
        printf("Connection closed!\n");
    }
    else    //错误处理
    {
        printf("Connection Failed!\n");
        if(mysql_errno(conn_ptr))
        {
            printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
        }
        return -2;
    }

    return 0;
}

编译及运行结果:
Linux下使用C语言访问MySQL数据库(三):访问实现代码
以上。
参考资料:
刘学勇.Linux C编程从入门到精通[M].北京,电子工业出版社,2014.1.