【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysqlclient

【送给在路上的程序猿】

对于一个开发人员而言,能够胜任系统中随意一个模块的开发是其核心价值的体现。

对于一个架构师而言,掌握各种语言的优势并能够利运用到系统中,由此简化系统的开发,是其架构生涯的第一步。

对于一个开发团队而言。能够在短期内开发出用户惬意的软件系统是其核心竞争力的体现。

每个程序猿都不能固步自封,要多接触新的行业,新的技术领域,突破自我。



makefile

.SUFFIXES: .c .o

CC=gcc
SRCS=mysql1.c            mydb.c

OBJS=$(SRCS:.c=.o)
EXEC=mysql1

all: $(OBJS)
    $(CC) -o $(EXEC) $(OBJS) -lmysqlclient
    @echo ‘-------------ok--------------‘

.c.o:
    $(CC) -Wall -g -o [email protected] -c $< 

clean:
    rm -f $(OBJS)
    rm -f core*

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);//连接到mysql

    if (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"
                else
                    printf("%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;
}

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;
}

|========== 吴英强CSDN博客专栏==========|

|== C/C++学院 专栏文章的内容(不定期更新)===|

|== linux驱动开发 探索linux底层的奥秘 ========|

|== Java基础学习篇 掌握java语言的基础知识=====|

|====== 每天进步一点点,健康快乐每一天 ======|

时间: 2024-08-25 03:13:39

【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysqlclient的相关文章

MySQL数据库、C语言免费技术交流活动201503

  老男孩教育2015 MySQL数据库.C语言免费技术交流活动 适用人群:对运维自动化开发.IT系统架构管理.数据库管理有兴趣的IT从业人员 听课时间:2015年3月14日(周六)下午1:00(提前20分钟签到) 听课地点:北京市昌平区沙河青年创业大厦B座1519室(地铁昌平线沙河站B1口右转200米) 听课内容: MySql DBA(1.5-2小时) 主题:SQL优化和MySQL高可用架构(门户经验) 专业级MySQL DBA SQL优化的思想. 通过案例分析从开发人员的角度上如何设计高效S

Linux 中的MYSQL数据库常用管理语言

Linux 中的MYSQL数据库管理语言1 登录数据库mysql -u (用户) -p输入密码 2 查看数据库 show databases ;3 使用数据库 use 库名 :4 查看库中的表 show tables :5 查看表的结构 describe 表名 :6 创建和删除数据库Create database 库名 :Drop database 库名 :7 创建表Create table 表名 (字段1 类型,字段2 类型,- ,primary key (主键名)):8 删除表Drop ta

Django2.2连接mysql数据库出现django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None问题

在使用Django2.2开发的时候,想要使用mysql数据库,在settings.py文件中更改命令: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'python', 'USER': "root", 'PASSWORD': "yhr2323214310", 'HOST': '', 'PORT': '' }} 再安装好pymysql,然后在__init__.py文件中

【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端

makefile .SUFFIXES: .c .o CC=gcc SRCS=mysql1.c mydb.c OBJS=$(SRCS:.c=.o) EXEC=mysql1 all: $(OBJS) $(CC) -o $(EXEC) $(OBJS) -lmysqlclient @echo '-------------ok--------------' .c.o: $(CC) -Wall -g -o [email protected] -c $< clean: rm -f $(OBJS) rm -f

zabbix编译安装,安装mysql数据库:configure: error: Not found mysqlclient library

在编译时,可能会出现题目中所示的错误,可以通过安装mysql-devel这个库解决: # yum install mysql-devel 注:如果出现“configure: error : Not found NET-SNMP library”,那么可以安装“net-snmp-devel”来解决: #yum install net-snmp-devel 原文地址:https://www.cnblogs.com/cxq20190307/p/10742447.html

【转】win32,win64编程永恒;语言编程需要注意的64位和32机器的区别

原文网址:http://www.cnblogs.com/kex1n/archive/2010/10/06/1844737.html 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C99标准并不规定具体数据类型的长度大小,只规定级别.作下比较: 16位平台 char         1个字节8位 short        2个字节16位 int            2个字节16位 long         4个字节32位 指针         2个字节 32位平台 char 

使用C语言调用mysql数据库编程实战以及技巧

今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_real_connect,原型例如以下: MYSQL * STDCALL mysql_real_connect( MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned

C连接MySQL数据库开发之Windows环境配置及测试

一.开发环境 Win8.1 64位.VS2013.MySQL5.5.3764位 MySQL安装目录为:C:\Program Files\MySQL\MySQL Server 5.5 二.配置工程环境 首先创建一个控制台空项目,打开VS2013,文件--> 新建项目 --> 常规 --> 选择"空项目" 因为我们要使用MySQL数据库的API接口编程,所以需要将工程的附加头文件搜索目录和附件库文件搜索目录,指向MySQL安装目录对应的位置,下面是我机子上mysql库和头

MySQL入门很简单: 15 java访问MySQL数据库

1. 连接数据库 1.1 下载安装驱动 java通过JDBC(Java Database Connectivity,Java数据库连接)来访问MySQL数据库.JDBC的编程接口提供的接口和类与MySQL数据库建立连接,然后将SQL语句的执行结果进行处理. 1)下载MySQL Connector/J驱动 http://dev.mysql.com/downloads/file/?id=460363 2)MyEclipse导入JDBC驱动 Window|Perference  Path|User L