用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 = 
        "\t1.Show databases\n\
        2.Change database\n\
        3.Drop database\n\
        4.Show tables\n\
        5.Desc table\n\
        6.Drop table\n\
        7.Print table\n\
        8.Insert table\n\
        9.Update table\n\
        10.Delete data";
    MYSQL *mysql = mysql_init(NULL);           // 创建一个MYSQL句柄并初始化
    if (!mysql) {
        my_error("mysql_init", __LINE__);
    }
    // 连接MYSQL数据库
    mysql_connect(mysql);
    while (1)
    {  
        printf("%s\n",dir);  
        printf("\nYour 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!\n");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\n", mysql_error(mysql));  
        my_error("mysql_real_connect", __LINE__);
    }  
    printf("Connect database sucessfully!\n\n");
}  

/* 显示所有数据库 */
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\n", mysql_error(mysql));
        return;
    }  
    res = mysql_store_result(mysql);
    printf("\n");
    while (row = mysql_fetch_row(res)) {
        for(t = 0; t < mysql_num_fields(res); t++) {
            printf("%s\t",row[t]);
        }  
        printf("\n");
    }
    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\n", mysql_error(mysql));  
        return;
    }  
    printf("\nChange sucessfully!\n\n");  
}

/* 删除数据库 */
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\n", mysql_error(mysql));  
        return;
    }  
    printf("\nDrop database sucessfully!\n\n");  
}

/* 打印当前数据库中的表 */
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\n", mysql_error(mysql));
        return;
    } 
    res = mysql_store_result(mysql);
    printf("\n");
    while (row = mysql_fetch_row(res)) {
        for(t = 0; t < mysql_num_fields(res); t++) {
            printf("%s\t", row[t]);
        }
        printf("\n");  
    }  
    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, '\0', sizeof(table_name));
    memset(query, '\0', 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\n",mysql_error(mysql));  
        return;
    }  
    res = mysql_store_result(mysql);
    printf("\n");
    while (row = mysql_fetch_row(res)) {
        for(t = 0; t < mysql_num_fields(res); t++) {  
            printf("%s\t",row[t]);
        }  
        printf("\n");  
    } 
    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, '\0', sizeof(query));
    memset(table_name, '\0', 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\n", mysql_error(mysql));  
        return;
    }  
    printf("\nQuery successfully!\n\n");  

    res = mysql_store_result(mysql);
    while (row = mysql_fetch_row(res)) {  
        for(t = 0; t < mysql_num_fields(res); t++) {  
            printf("%s\t", row[t]);  
        }  
        printf("\n");
    }  
    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\n", mysql_error(mysql));  
        return;
    }  
    printf("\nDrop table sucessfully!\n\n");  
}

/* 插入数据 */
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, '\0', sizeof(field));
    memset(table_name, '\0', sizeof(table_name));
    memset(message, '\0', 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\n", query);  

    t = mysql_real_query(mysql, query, strlen(query));
    if (t) {  
        printf("Failed to query: %s\n", mysql_error(mysql));  
        return;
    }  
    printf("\nInsert sucessfully!\n\n");
}  

/* 删除数据 */
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, '\0', sizeof(table_name));
    memset(del_name, '\0', 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\n", query);

    t = mysql_real_query(mysql, query, strlen(query));
    if (t) {  
        printf("Failed to query: %s\n", mysql_error(mysql));  
        return;
    }
    printf("Delete data sucessfully!\n");  
}  

/* 更新数据 */
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, '\0', sizeof(table_name));
    memset(field_name, '\0', sizeof(field_name));
    memset(up_value, '\0', 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\n", query);

    t = mysql_real_query(mysql, query, strlen(query));
    if (t) {  
        printf("Failed to query: %s\n", mysql_error(mysql));  
        return;
    }
    printf("Update data sucessfully!\n");
}

void close_connection(MYSQL *mysql)
{
    mysql_close(mysql);
}

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

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

posted @ 2017-09-09 14:31  Tattoo_Welkin  阅读(244)  评论(0编辑  收藏  举报