【送给在路上的程序猿】



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





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





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



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


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 $@ -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语言的基础知识=====|



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

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

  1. MySQL入门——MySQL数据库和SQL语言

    MySQL入门——MySQL数据库和SQL语言 摘要:本文主要了解了MySQL关系型数据库和SQL语言的基本知识. MySQL数据库 简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB ...

  2. 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. ...

  3. Mysql 数据库学习笔记02 编程

    一.常量 * 字符串常量 * 数值常量 * 十六进制常量 * 日期时间常量 * 位字段常量 * 布尔值 * NULL值 二.变量 * 用户变量:用户自定义变量: * 系统变量:系统内部定义的变量: 1 ...

  4. mysql数据库基本操作sql语言

    mysql的启动与关闭 启动 /etc/init.d/mysql start 多实例使用自建脚本启动 2种关闭数据库方法 mysqladmin -uroot -p密码 shutdown #优雅关闭/e ...

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

    原文网址:http://www.cnblogs.com/kex1n/archive/2010/10/06/1844737.html 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C ...

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

    今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_re ...

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

    一.开发环境 Win8.1 64位.VS2013.MySQL5.5.3764位 MySQL安装目录为:C:\Program Files\MySQL\MySQL Server 5.5 二.配置工程环境 ...

  8. linux下应用crontab对mysql数据库进行定时备份

    linux下应用crontab对mysql数据库进行定时备份 @(编程) mysql数据库提供了备份命令mysqldump,可以结合crontab命令进行定时备份. 我写了一个mysqlbackup. ...

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

    1. 连接数据库 1.1 下载安装驱动 java通过JDBC(Java Database Connectivity,Java数据库连接)来访问MySQL数据库.JDBC的编程接口提供的接口和类与MyS ...

随机推荐

  1. Vue的学习--环境配置

    1.  下载vue.min.js或者使用CDN 2.  安装Vue-cli环境 我在window7 32位下使用命令行cmd进行的操作 安装之前应该使用node -v和npm -v检查一下node和n ...

  2. python学习三:列表,元组

    1.列表: 1.列表的定义方式: list1 = [1,2,3,4,"hello","world"] 如上所示,list1就是一个列表,列表的内容以中括号包含起 ...

  3. 【习题 7-2 UVA-225】Golygons

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 暴力枚举每次走哪里就好. 用一个二维数组来判重.(数据里,要求不能经过一个点两次->但路径可以相交 然后再用一个flag数组, ...

  4. Objc执行时读取和写入plist文件遇到的问题

    以下是本猫保持游戏NPC和物件交互的plist文件: 随着游戏和玩家逐步发生互动,玩家会改动人物和物件的交互的状态.这也是RPG游戏最主要的功能. 在切换每一个地图时须要将上一个地图发生的改变存储到p ...

  5. 导入数据库工具有关的oracle sql操作

    alter table TAB_user add (personal varchar2(30) default '用户名' not null);alter table TAB_user modify ...

  6. 整理wmic使用,不重启变环境变量 .

    整理wmic使用,不重启变环境变量 . 利用wmic修改是直接生效的:(e:\tools 是新添加的目录) wmic ENVIRONMENT where "name='path' and u ...

  7. [React] Configure a React & Redux Application For Production Deployment and Deploy to Now

    In this lesson, we’ll make a few small changes to our scripts and add some environment variables tha ...

  8. GDB中创建要素数据集

    转自 在geodatabase中创建要素集 //在数据集中创建要素 private void menuItem25_Click(object sender, System.EventArgs e) { ...

  9. UWP 新手教程1——UWP的前世今生

    文件夹 引言 设备族群 UI 和通用输入模式 通用控件和布局面板 工具 自适应扩展 通用输入处理 引言 在本篇文章中,可以掌握下面知识: 设备族群,怎样决定目标设备 新的UI控件和新面板帮助你适应不同 ...

  10. 使用Perl合并文件

    使用Perl合并文件 有时需要将整个目录下的小文件合并到一个文件中,以便查阅检索 特性 整个目录完全遍历,自动存入单个文件 顺序遍历文件 待合并的目录 合并后的文件内容 syscfg/test1 sy ...