C语言实现远程MySql的增删改查

mysql_query(MYSQL *connevtion, char *sql)

执行SELECT语句得到查询结果

MYSQL_RES *mysql_store_result(MYSQL *pmysql);

成功返回一个查询结果指针,查询为结果或者错误返回NULL

mysql_free_result(MYSQL_RES *result)

调用完mysql_store_result,一定要释放相关资源。


查看查询结果的行信息

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); //返回的是记录(行)

查看查询结果的字段信息

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); //返回的是字段(列)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <mysql/mysql.h>

#define BUFSIZE 1024

MYSQL mysql, *connection = NULL;

void deletename(char *SQL)
{
    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要干掉的名字>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    // SQL程序的标准写法如下所示
    char name[1024];
    memset(name, 0, sizeof(name));
    read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要删除的名字
    name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉

    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "delete from table1 where name = '%s'", name);
    printf("'%s'\n", SQL);
}

void insertname(char *SQL)
{
    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要插入的名字>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    // SQL程序的标准写法如下所示
    char name[1024];
    memset(name, 0, sizeof(name));
    read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要插入的名字
    name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉

    sprintf(SQL, "%s", "请输入要插入的性别>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    char sex[1024];
    memset(sex, 0, sizeof(sex));
    read(STDIN_FILENO, sex, sizeof(sex));// 等待用户输入要插入的性别
    sex[strlen(sex) - 1] = 0;// 将字符串最后一个回车去掉

    sprintf(SQL, "%s", "请输入要插入的年龄>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    char age[1024];
    memset(age, 0, sizeof(age));
    read(STDIN_FILENO, age, sizeof(age));// 等待用户输入要插入的年龄
    age[strlen(age) - 1] = 0;// 将字符串最后一个回车去掉

    sprintf(SQL, "%s", "请输入要插入的班级>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    char classid[1024];
    memset(classid, 0, sizeof(classid));
    read(STDIN_FILENO, classid, sizeof(classid));// 等待用户输入要插入的班级
    classid[strlen(classid) - 1] = 0;// 将字符串最后一个回车去掉


    sprintf(SQL, "INSERT INTO table1 (name, sex, age, class) VALUES ('%s', '%s', %s, '%s')", name, sex, age, classid);
    printf("'%s'\n", SQL);
}

void updatename(char *SQL)
{
    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要修改的名字>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    // SQL程序的标准写法如下所示
    char name[1024];
    memset(name, 0, sizeof(name));
    read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要更新的名字
    name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉

    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要修改的性別>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    // SQL程序的标准写法如下所示
    char sex[1024];
    memset(sex, 0, sizeof(sex));
    read(STDIN_FILENO, sex, sizeof(sex));// 等待用户输入要更新的性別
    sex[strlen(sex) - 1] = 0;// 将字符串最后一个回车去掉

    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要修改的年齡>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    // SQL程序的标准写法如下所示
    char age[1024];
    memset(age, 0, sizeof(age));
    read(STDIN_FILENO, age, sizeof(age));// 等待用户输入要更新的性別
    age[strlen(age) - 1] = 0;// 将字符串最后一个回车去掉

    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要修改的班级>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    // SQL程序的标准写法如下所示
    char classes[1024];
    memset(classes, 0, sizeof(classes));
    read(STDIN_FILENO, classes, sizeof(classes));// 等待用户输入要更新的班级
    classes[strlen(classes) - 1] = 0;// 将字符串最后一个回车去掉

    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "UPDATA table1 SET sex = '%s', age = '%s', class = '%s' WHERE name = '%s'", sex, age, classes, name);

    printf("'%s'\n", SQL);
}

void selectname(char *SQL)
{
	/*
    char SQL[1024];
    memset(SQL, 0, BUFSIZE);
    sprintf(SQL, "%s", "请输入要查询的名字>:");
    write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要\n也能像屏幕输出了
    char name[1024];
    memset(name, 0, sizeof(name));
    read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要更新的名字
    name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
    memset(SQL, 0, BUFSIZE);

    if (strlen(name) == 0)
    {
        sprintf(SQL, "SELECT * FROM table1");
    }
    else
    {
        sprintf(SQL, "SELECT * FROM table1 WHERE name = '%s'", name);
    }
*/
    if (mysql_query(connection, SQL) != 0)
    {
        printf("query error, %s\n", mysql_error(&mysql));
    }

    // 調用mysql__stor_result得到查詢結果,放到result當中
    MYSQL_RES *result = mysql_store_result(connection);
    // 要知道返回数据有多少列才能自由的使用各种SELECT语句
    MYSQL_FIELD *field;
    int iFieldCount = 0;
    while (1)
    {
    	field = mysql_fetch_field(result);// 循环得到列名,如果循环到列的最后,返回NULL
    	if (field == NULL)
    		break;
    	iFieldCount++;
    	printf("%s\t", field->name);
    }
    printf("\n");

    // 循环遍历每一行
    MYSQL_ROW row;
    while (1)
    {
        row = mysql_fetch_row(result);
        if (row == NULL)
            break;
        int i = 0;
        for (; i < iFieldCount; i++)
        {
        	printf("%s\t", (const char*)row[i]);
        }
        printf("\n");

    }
    mysql_free_result(result);
}

int main(int arg, char *args[])
{
    if (arg < 5)
    {
        return -1;
    }

    mysql_init(&mysql); // 相当于SQL内部初始化了一个TCP的socket,同时初始化了SQL必须的内存和一些结构

    // 连接mysql_server
    connection = mysql_real_connect(&mysql, args[1], args[2], args[3],
            args[4], 0, 0, 0);
    if (connection == NULL)
    {
        printf("connect error %s\n", mysql_error(&mysql));
        return -1;
    }

    if (mysql_query(connection, "SET NAMES utf8") != 0)
    {
        printf("设置字符集错误, %s\n", mysql_error(&mysql));
    }

    char buf[BUFSIZE];
    memset(buf, 0, sizeof(buf));
    strcpy(buf, "请选择\n1:插入\n2:删除\n3:修改\n4:查询\n");
    write(STDOUT_FILENO, buf, sizeof(buf));
    memset(buf, 0, sizeof(buf));
    read(STDIN_FILENO, buf, sizeof(buf));
    if (strncmp(buf, "4", 1) == 0)
    {
        memset(buf, 0, sizeof(buf));
        strcpy(buf, "请输入任意SELECT语句:");
        write(STDOUT_FILENO, buf, sizeof(buf));
        memset(buf, 0, sizeof(buf));
        read(STDIN_FILENO, buf, sizeof(buf));
    	selectname(buf);
    }
    else
    {
        if (strncmp(buf, "1", 1) == 0)
        {
            insertname(buf);
        }

        if (strncmp(buf, "2", 1) == 0)
        {
            deletename(buf);
        }

        if (strncmp(buf, "3", 1) == 0)
        {
            updatename(buf);
        }
        mysql_query(connection, buf);
    }

    mysql_close(connection);

    return EXIT_SUCCESS;
}

/*
     下面测试
    printf("AAAAAAAAAAAA");// 这个时候printf会吧输出的字符串放到输出缓冲区里面,直到遇到\n才会输出,或者输出缓冲区满了

    memset(name, 0, sizeof(name));
    read(STDIN_FILENO, name, sizeof(name));// 等待用户输入要删除的名字
    name[strlen(name) - 1] = 0;// 将字符串最后一个回车去掉
*/

/*struct termios term; // 定义一个termios结构
if (tcgetattr(STDIN_FILENO, &term) == -1)
{
    printf("tchetattr error is %s\n", strerror(errno));
    return 0;
}

// oldterm = term; // 保留当前termios设置,以便程序退出的时候可以恢复termios


 //term.c_lflag &= ~ICANON;// 取消ICANON选项(不规范输入)
 //term.c_lflag |= ICANON;// 设置ICNON选项(规范输入)
 //term.c_cc字段为要设置的具体特殊输入字符,如c_cc[VERASE]代表退格键,
 //term.c_cc[VERASE] = '\b';意思为把退格键修改为'\b'
 //VERASE代表向前擦除一个字符,VINTR代表发送ctrl + c中断信号,ctrl + c的ASCII码为3
 //例如:term.c_cc[VINTR] = '\t';意思为将tab键设置为中断信号
 //tcsetattr中,第二个参数说明,TCSAFLUSH:发送了所有输出后更改才生效,在更改发生时,未读取的所有输入数据都被删除
 //TCSANOW:更改立即生效
 //TCSADRAIN:发送了所有输出后更改才发生,如果更改输出参数则应该使用该选项

term.c_cc[VERASE] = '\b';// '\b'为退格键的ASCII吗
if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)// 设置系统termion
{
    printf("tcsetattr error is %s\n", strerror(errno));
}


//system("stty erase ^H");// 可以实现在输入状态下,按退格键删除,不回显,等同于上面功能
*/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值