• 用C操作MYSQL数据库


    第一步:啥叫句柄,就是一个数字,就和你去饭店吃饭要排队,前台小姐给你分配了一个编号一样,然后她可以通过编号找到你。而在操作系统或者某种其他编程系统中,句柄就是这样的一个编号,用来对各种奇奇怪怪的东西编号,系统对你来说是一个黑箱,你只能通过这个编号向系统要东西

    第二步:C语言操作mysql数据库常用函数

    所用到的头文件: mysql/mysql.h

    功能: 获得或初始化一个MYSQL句柄

    函数原型: MYSQL *mysql_init(MYSQL *mysql)
    函数返回值: 一个被始化的MYSQL*句柄
    备注: 在内存不足的情况下,返回NULL

    函数功能: 连接一个MySQL服务器(在连接之前,必须先进行过初始化

    函数原型:

    MYSQL *mysql_real_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned int client_flag);

    函数传入值: mysql 连接句柄
    host表示MYSQL服务器的主机名或IP
    user表示登录的用户名
    passwd表示登录的密码
    db表示要连接的数据库
    port表示MySQL服务器的TCP/IP端口
    unix_socket表示连接类型
    client_flag表示MySQL运行ODBC数据库的标记,一般为 0
    函数返回值: 如果连接成功,返回一个MYSQL*连接句柄:如果连接失败,NULL

    函数功能: 关闭一个服务器连接,并释放与连接相关的内存

    函数原型: void mysql_close(MYSQL *mysql);
    函数传入值: MYSQL:类型的指针
    函数返回值: 无

    函数功能: 执行SQL 语句

    函数原型:
    int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
    函数传入值: query表示执行的SQL语句,length 表示SQL 语句的长度
    函数返回值: 如果查询成功,为,出错为非零

    注意:如果查到数据,语句执行成功 。如果没有数据可以查到,那么语句也是执行成功的 。函数执行出错的原因主要有1.SQL 语句出错 。2. 主键的约束等方面 。

    函数功能: 获得[结果集]

    (https://baike.baidu.com/item/%E7%BB%93%E6%9E%9C%E9%9B%86)
    函数原型: MYSQL_RES *mysql_store_result(MYSQL *mysql)
    函数传入值: MYSQL 类型的指针
    函数返回值: 一个MYSQL_RES结果结构,如果发生错误,返回NULL

    函数功能:检索一个结果集的下一行

    函数原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    函数传入值:MYSQL_RES:结构的指针
    函数返回值:下一行的一个MYSQL_ROW结构。如果没有更多的行可检索或如果出现一个错误,NULL

    函数功能:返回指定结果集中列的数量

    函数原型:unsigned int mysql_num_fields(MYSQL_RES *res);
    函数传入值:MYSQL_RES 结构的指针
    函数返回值:结果集中列的数目

    注意:要判断是否查询到数据,不能用该函数是否等于 0 去判断 。如果没有查询到数据 ,用该函数判断依然是表的列的数量

    函数功能:返回指定结果集中行的数量

    函数原型:my_ulonglong mysql_num_rows(MYSQL_RES *result);
    函数传入值:MYSQL_RES 结构的指针
    函数返回值:结果集中行的数目

    注意:要判断是否查询到数据,用该函数是否等于 0 去判断 。等于0 没查到数据 ,否则查到数据

    第三步:C语言操作mysql 实例

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <mysql/mysql.h>  
    
    #define HOST    "localhost"
    #define USER    "root"
    #define PASSWD  "***********"
    #define DB_NAME "TEST000"
    
    void my_error(const char *err_string, int line);    // 错误处理函数
    void mysql_connect(MYSQL *mysql);                   // 连接mysql数据库
    void show_databases(MYSQL *mysql);                  // 显示所有数据库
    void change_database(MYSQL *mysql);                 // 改变数据库
    void drop_database(MYSQL *mysql);                   // 删除数据库
    void show_tables(MYSQL *mysql);                     // 显示当前数据库所有表
    void desc_table(MYSQL *mysql);                      // 显示表的字段信息
    void drop_table(MYSQL *mysql);                      // 删除表
    void print_table(MYSQL *mysql);                     // 显示表中内容
    void insert_data(MYSQL *mysql);                     // 插入数据
    void update_data(MYSQL *mysql);                     // 修改数据
    void delete_data(MYSQL *mysql);                     // 删除数据
    void close_connection(MYSQL *mysql);                // 关闭mysql数据库
    
    int main(int argc, char *argv[])
    {  
        int choice;  
        char *dir = 
            "	1.Show databases
    
            2.Change database
    
            3.Drop database
    
            4.Show tables
    
            5.Desc table
    
            6.Drop table
    
            7.Print table
    
            8.Insert table
    
            9.Update table
    
            10.Delete data";
        MYSQL *mysql = mysql_init(NULL);           // 创建一个MYSQL句柄并初始化
        if (!mysql) {
            my_error("mysql_init", __LINE__);
        }
        // 连接MYSQL数据库
        mysql_connect(mysql);
        while (1)
        {  
            printf("%s
    ",dir);  
            printf("
    Your choice: ");  
            scanf("%d", &choice);  
            switch(choice)
            {  
                case 1:show_databases(mysql);break;  
                case 2:change_database(mysql);break;  
                case 3:drop_database(mysql);break;  
                case 4:show_tables(mysql);break;  
                case 5:desc_table(mysql); break;  
                case 6:drop_table(mysql); break;
                case 7:print_table(mysql);break;
                case 8:insert_data(mysql);break;
                case 9:update_data(mysql);break;
                case 10:delete_data(mysql);break;
                default:printf("No your choice!
    ");break;
            }  
        }
        close_connection(mysql);
        return 0;  
    }  
    
    void my_error(const char *err_string, int line) 
    {
        fprintf(stderr, "line: %d ", line);
        perror(err_string);
        exit(1);
    }
    
    /* 连接mysql数据库 */  
    void mysql_connect(MYSQL *mysql)
    {  
        if(!mysql_real_connect(mysql, HOST, USER, PASSWD, DB_NAME, 0, NULL, 0)) {  
            printf("Failed to connect:%s
    ", mysql_error(mysql));  
            my_error("mysql_real_connect", __LINE__);
        }  
        printf("Connect database sucessfully!
    
    ");
    }  
    
    /* 显示所有数据库 */
    void show_databases(MYSQL *mysql)  
    {  
        int t;  
        char *query ="show databases";
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
        t = mysql_real_query(mysql, query, strlen(query));  
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));
            return;
        }  
        res = mysql_store_result(mysql);
        printf("
    ");
        while (row = mysql_fetch_row(res)) {
            for(t = 0; t < mysql_num_fields(res); t++) {
                printf("%s	",row[t]);
            }  
            printf("
    ");
        }
        mysql_free_result(res);
    }
    
    /* 改变数据库 */  
    void change_database(MYSQL *mysql)  
    {  
        int t;  
        char *head = "use ";  
        char query[30];
        char db_name[20];
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        printf("Please enter the database to change: ");
        scanf("%s", db_name);
        sprintf(query, "%s%s", head, db_name);
    
        t = mysql_real_query(mysql, query, strlen(query));
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }  
        printf("
    Change sucessfully!
    
    ");  
    }
    
    /* 删除数据库 */
    void drop_database(MYSQL *mysql)
    {
        int t;  
        char *head = "drop database ";  
        char query[50];
        char db_name[20];
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        printf("Please enter the database to drop: ");
        scanf("%s", db_name);
        sprintf(query, "%s%s", head, db_name);
    
        t = mysql_real_query(mysql, query, strlen(query));
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }  
        printf("
    Drop database sucessfully!
    
    ");  
    }
    
    /* 打印当前数据库中的表 */
    void show_tables(MYSQL *mysql)
    {  
        int t;  
        char *query = "show tables";  
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        t = mysql_real_query(mysql, query, strlen(query));  
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));
            return;
        } 
        res = mysql_store_result(mysql);
        printf("
    ");
        while (row = mysql_fetch_row(res)) {
            for(t = 0; t < mysql_num_fields(res); t++) {
                printf("%s	", row[t]);
            }
            printf("
    ");  
        }  
        mysql_free_result(res);
    }
    
    /* 打印表的字段 */  
    void desc_table(MYSQL *mysql)
    {  
        int t;  
        char *head = "desc ";
        char table_name[20];  
        char query[30];  
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        memset(table_name, '', sizeof(table_name));
        memset(query, '', sizeof(query));
    
        printf("Please enter the table name: ");  
        scanf("%s", table_name);  
        sprintf(query, "%s%s", head, table_name);
    
        t = mysql_real_query(mysql, query, strlen(query));  
        if (t) {  
            printf("Failed to query: %s
    ",mysql_error(mysql));  
            return;
        }  
        res = mysql_store_result(mysql);
        printf("
    ");
        while (row = mysql_fetch_row(res)) {
            for(t = 0; t < mysql_num_fields(res); t++) {  
                printf("%s	",row[t]);
            }  
            printf("
    ");  
        } 
        mysql_free_result(res);
    }  
    
    /* 打印表中数据 */
    void print_table(MYSQL *mysql)  
    {  
        int t;
        char *head = "select * from ";
        char table_name[20];
        char query[50];
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        memset(query, '', sizeof(query));
        memset(table_name, '', sizeof(table_name));
    
        printf("Please enter table name: ");  
        scanf("%s", table_name);
        sprintf(query, "%s%s", head,table_name);
    
        t = mysql_real_query(mysql, query, strlen(query));  
    
        if (t) {
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }  
        printf("
    Query successfully!
    
    ");  
    
        res = mysql_store_result(mysql);
        while (row = mysql_fetch_row(res)) {  
            for(t = 0; t < mysql_num_fields(res); t++) {  
                printf("%s	", row[t]);  
            }  
            printf("
    ");
        }  
        mysql_free_result(res);
    }  
    
    /* 删除表 */
    void drop_table(MYSQL *mysql)
    {
        int t;  
        char *head = "drop table ";  
        char query[50];
        char table_name[20];
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        printf("Please enter the table to drop: ");
        scanf("%s", table_name);
        sprintf(query, "%s%s", head, table_name);
    
        t = mysql_real_query(mysql, query, strlen(query));
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }  
        printf("
    Drop table sucessfully!
    
    ");  
    }
    
    /* 插入数据 */
    void insert_data(MYSQL *mysql)
    {  
        int t;  
        char *head = "insert into ";  
        char query[200];
        char table_name[20];  
        char field[50];
        char *left = "(";  
        char *right = ") ";  
        char *values = "values";  
        char message[100];  
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        memset(field, '', sizeof(field));
        memset(table_name, '', sizeof(table_name));
        memset(message, '', sizeof(message));
    
        printf("Please enter table_name: ");  
        scanf("%s", table_name); 
    
        printf("Please enter the Field you want to write(split with comma): ");
        scanf("%s", field);  
    
        printf("Please write the message to the field(split with comma): ");
        scanf("%s", message);  
    
        /* 把几个变量字符串连接成一个完整的mysql命令 */  
        sprintf(query, "%s%s%s%s%s%s%s%s%s", head, table_name, left, 
                                field, right, values, left, message, right);
        printf("%s
    ", query);  
    
        t = mysql_real_query(mysql, query, strlen(query));
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }  
        printf("
    Insert sucessfully!
    
    ");
    }  
    
    /* 删除数据 */
    void delete_data(MYSQL *mysql)
    {  
        int t;
        char *head = "delete from ";  
        char query[200];  
        char table_name[20];  
        char del_name[20];  
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        memset(table_name, '', sizeof(table_name));
        memset(del_name, '', sizeof(del_name));
    
        printf("Please enter the table: ");  
        scanf("%s",table_name);  
    
        printf("please enter del name: ");  
        scanf("%s",del_name);  
    
        sprintf(query, "%s%s where name ="%s"", head, table_name, del_name);
        printf("%s
    ", query);
    
        t = mysql_real_query(mysql, query, strlen(query));
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }
        printf("Delete data sucessfully!
    ");  
    }  
    
    /* 更新数据 */
    void update_data(MYSQL *mysql)
    {  
        int t;
        char *head = "update ";
        char query[100];
        char table_name[20];  
        char field_name[20];
        char up_value[30];
        MYSQL_RES *res;         // 返回查询结果
        MYSQL_ROW row;          // 返回行数据
    
        memset(table_name, '', sizeof(table_name));
        memset(field_name, '', sizeof(field_name));
        memset(up_value, '', sizeof(up_value));
    
        printf("Please enter the table_name: ");  
        scanf("%s", table_name);  
    
        printf("please enter field_name: ");
        scanf("%s", field_name);  
    
        printf("please enter up value: ");
        scanf("%s", up_value);  
    
        sprintf(query, "%s%s set %s="%s"", head, table_name, field_name, up_value);
        printf("%s
    ", query);
    
        t = mysql_real_query(mysql, query, strlen(query));
        if (t) {  
            printf("Failed to query: %s
    ", mysql_error(mysql));  
            return;
        }
        printf("Update data sucessfully!
    ");
    }
    
    void close_connection(MYSQL *mysql)
    {
        mysql_close(mysql);
    }

    注意:sprintf 的构造有点拖拉,仅作为连接数据库的实例

    执行结果截图:
    这里写图片描述

  • 相关阅读:
    并发容器和框架之ConcurrentHashMap
    Java的LockSupport工具,Condition接口和ConditionObject
    从源码来看ReentrantLock和ReentrantReadWriteLock
    VMWARE虚拟机上Terminal中使用sudo出现”** 不在sudoers文件中,此事将被警告 “错误
    mac下idea运行项目慢问题解决
    Idea 只修改编辑区主题
    redis内部数据结构的数据结构
    mysql存储过程详解
    HashMap中resize()剖析
    谈Redis的refash的增量式扩容
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335333.html
Copyright © 2020-2023  润新知