C语言连接到数据库实现一个具有简单的client端功能
来源:互联网 发布:国际象棋对弈软件下载 编辑:程序博客网 时间:2024/06/04 19:40
mysql1.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <errno.h>#include <termios.h>#include "mydb.h"void sqldb(const char *src)//参数src为要执行的SQL语句{if ((strncmp(src, "select", 6) == 0) || (strncmp(src, "SELECT", 6) == 0)|| (strncmp(src, "show", 4) == 0) || (strncmp(src, "SHOW", 4) == 0)|| (strncmp(src, "desc", 4) == 0) || (strncmp(src, "DESC", 4) == 0)){open_db(src);//如果src为有返回数据集SQL语句,那么调用open_db函数} else{exec_db(src);//如果src为没有有返回数据集SQL语句,那么调用exec_db函数}}void work(const char *userid, const char *password){init_db();if (conn_db("localhost", userid, password, "test") != 0)//连接到数据库{return;//连接数据库失败,函数退出}char buf[2048];while (1)//循环从键盘读取{write(STDOUT_FILENO, "mysql1>", strlen("mysql1>"));//屏幕输出命令提示符mysql1>memset(buf, 0, sizeof(buf));read(STDIN_FILENO, buf, sizeof(buf));//等待用户从键盘输入if (strncmp(buf, "quit", 4) == 0)break;//用户输入quit,循环break;sqldb(buf);}disconn_db();//断开数据库连接}struct termios oldterm;void setstty()//设置输入退格键,不回显{//system("stty erase ^H");//执行shell命令,也可以 用来设置读取用户键盘输入的时候,退格键不回显struct termios term;if(tcgetattr(STDIN_FILENO, &term) == -1)//得到系统termion的设置{printf("tcgetattr error is %s\n", strerror(errno));return;}oldterm = term;//保留当前termios设置,以便程序退出的时候可以恢复termios/*term.c_lflag &= ~ICANON;//取消ICANON选项(不规范输入)term.c_lflag |= ICANON;//设置ICANON选项(规范输入)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));}return;}void returnstty()//恢复系统的termios设置{if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &oldterm) == -1)//设置系统termion{printf("tcsetattr error is %s\n", strerror(errno));}return;}int main(int arg, char *args[]){if (arg < 4)//如果没有参数,main函数退出{return EXIT_FAILURE;}if (strncmp(args[1], "-u", 2) != 0)//如果第二个参数不是-u,main函数退出{return EXIT_FAILURE;}if (strncmp(args[3], "-p", 2) != 0)//如果第四个参数不是-p,main函数退出{return EXIT_FAILURE;}const char *passwd = getpass("please input password:");//输入密码,屏幕不回显setstty();//设置输入退格键,不回显work(args[2], passwd);returnstty();//恢复系统的termios设置return EXIT_SUCCESS;}mydb.h
#ifndef MYDB_H_#define MYDB_H_void init_db();int conn_db(const char *hostname, const char *username, const char *password,const char *dbname);void disconn_db();int open_db(const char *SQL);int exec_db(const char *SQL);#endif /* MYDB_H_ */
mydb.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <mysql/mysql.h>#include "mydb.h"MYSQL *connection = NULL;MYSQL mysql;void init_db(){mysql_init(&mysql);//初始化mysql}int conn_db(const char *hostname, const char *username, const char *password,const char *dbname){if (connection)mysql_close(connection);connection = mysql_real_connect(&mysql, hostname, username, password,dbname, 0, 0, 0);//连接到mysqlif (connection == NULL){printf("%s\n", mysql_error(&mysql));return -1;//连接失败,返回-1}printf("success connect to mysql\n");return 0;}void disconn_db()//断开数据库连接{if (connection){mysql_close(connection);connection = NULL;}}int open_db(const char *SQL)//执行有返回数据集的SQL语句{int state = mysql_query(connection, SQL);//执行SQL语句if (state != 0){printf("%s\n", mysql_error(connection));return -1;//执行失败,返回-1}MYSQL_RES *result = mysql_store_result(connection);//得到查询结果if (result == (MYSQL_RES *) NULL){printf("%s\n", mysql_error(connection));return -1;//执行失败,返回-1} else{MYSQL_FIELD *sqlField;int iFieldCount = 0;while (1)//循环遍历所有字段{sqlField = mysql_fetch_field(result);if (sqlField == NULL)break;printf("%s\t", sqlField->name);//向屏幕打印字段名iFieldCount++;}printf("\n");//每一行结尾打印一个\n字符MYSQL_ROW sqlRow;while (1)//循环到每一行{sqlRow = mysql_fetch_row(result);if (sqlRow == NULL)break;int i;for (i = 0; i < iFieldCount; i++)//循环得到每一行中的每个字段{if (sqlRow[i] == NULL)printf("NULL\t");//如果值为NULL,屏幕打印为"NULL"elseprintf("%s\t", (const char *)sqlRow[i]);//屏幕打印为字段内容}printf("\n");//每一行结尾打印一个\n字符}printf("query is ok, %u rows affected\n", (unsigned int)mysql_affected_rows(connection));mysql_free_result(result);}return 0;}int exec_db(const char *SQL)//执行没有返回数据集的SQL语句{int state = mysql_query(connection, SQL);//执行SQL语句if (state != 0){printf("%s\n", mysql_error(connection));return -1;}printf("query is ok, %u rows affected\n", (unsigned int)mysql_affected_rows(connection));return 0;}
0 0
- C语言连接到数据库实现一个具有简单的client端功能
- c语言实现一个简单的mysql client
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 用C语言实现一个简单的HTTP Client(HTTP客户端)
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 用C语言实现一个简单的HTTP Client(HTTP客户端)
- C语言 编写的一个简单的Server/Client
- 实现一个具有GetMin功能的栈
- 利用linux下的c语言编程来简单的实现一个shell功能实现!
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- C语言调用mysql数据库API实现简单的mysql客户端的功能
- 一个简单的HashMap C语言实现
- 一个简单的HashMap C语言实现
- BloomFilter的一个简单实现(C语言)
- C语言实现一个简单的计算器
- 【C语言】实现一个简单的通讯录
- 单调有界收敛准则
- win10安装TensorFlow填坑笔记
- Shiro与Redis集成,集群下的session共享
- 《Training:Setting Up File Sharing》
- Andriod Service 远程
- C语言连接到数据库实现一个具有简单的client端功能
- 左右都是半圆的selector
- 表达式求值
- 1.3.1微信小程序 WXML
- javascript添加删除div,对象的方法
- c++ primer plus 之for循环
- Unity 3D
- BZOJ4653: [Noi2016]区间
- 在Windows2008 Server服务器上开启Ping或者禁PING