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函数的,这样写就不需要 也能像屏幕输出了 // 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" ", SQL); } void insertname(char *SQL) { memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "请输入要插入的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要 也能像屏幕输出了 // 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函数的,这样写就不需要 也能像屏幕输出了 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函数的,这样写就不需要 也能像屏幕输出了 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函数的,这样写就不需要 也能像屏幕输出了 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" ", SQL); } void updatename(char *SQL) { memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "请输入要修改的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要 也能像屏幕输出了 // 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函数的,这样写就不需要 也能像屏幕输出了 // 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函数的,这样写就不需要 也能像屏幕输出了 // 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函数的,这样写就不需要 也能像屏幕输出了 // 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" ", SQL); } void selectname(char *SQL) { /* char SQL[1024]; memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "请输入要查询的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 这句话是替代printf函数的,这样写就不需要 也能像屏幕输出了 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 ", 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 ", field->name); } printf(" "); // 循环遍历每一行 MYSQL_ROW row; while (1) { row = mysql_fetch_row(result); if (row == NULL) break; int i = 0; for (; i < iFieldCount; i++) { printf("%s ", (const char*)row[i]); } printf(" "); } 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 ", mysql_error(&mysql)); return -1; } if (mysql_query(connection, "SET NAMES utf8") != 0) { printf("设置字符集错误, %s ", mysql_error(&mysql)); } char buf[BUFSIZE]; memset(buf, 0, sizeof(buf)); strcpy(buf, "请选择 1:插入 2:删除 3:修改 4:查询 "); 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会吧输出的字符串放到输出缓冲区里面,直到遇到 才会输出,或者输出缓冲区满了 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 ", 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] = "";意思为把退格键修改为"" //VERASE代表向前擦除一个字符,VINTR代表发送ctrl + c中断信号,ctrl + c的ASCII码为3 //例如:term.c_cc[VINTR] = " ";意思为将tab键设置为中断信号 //tcsetattr中,第二个参数说明,TCSAFLUSH:发送了所有输出后更改才生效,在更改发生时,未读取的所有输入数据都被删除 //TCSANOW:更改立即生效 //TCSADRAIN:发送了所有输出后更改才发生,如果更改输出参数则应该使用该选项 term.c_cc[VERASE] = "";// ""为退格键的ASCII吗 if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)// 设置系统termion { printf("tcsetattr error is %s ", strerror(errno)); } //system("stty erase ^H");// 可以实现在输入状态下,按退格键删除,不回显,等同于上面功能 */
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 操作系统实验--C语言模拟进程管理
- 下一篇: 操作系统-进程管理实验(1)