目录:

一、解决小的问题;

二、大问题,如果你不小心把/usr/lib的所属用户改了导致sudo命令用不了:

三、C连接MySql编程本身:

其实写这个程序真的很简单,十多分钟的事情,只是以前没在Linux下用纯C连过Mysql,想试一下,竟然搞了一整天,而且不是由于编码本身,是因为其他的一些周边问题,所以很有必要做一下笔记。

一、解决小的问题:

1、怎么自己去学着编写?

C语言针对MySql函数的帮助怎么查找:这些东西在MySql提供的帮助文档里都是有的,索引是C API。可以自己去下载chm格式的帮助文档,个人觉得这种文档比较好用,也可以去官网自行决定下载其他类型的帮助文档:http://dev.mysql.com/doc/,或者在线查找:https://dev.mysql.com/doc/refman/5.1/zh/apis.html。用高级语言编程其实就是学会使用帮助文档并付诸实践的过程。

2、在编写之前请确定自己有相关的头文件和库文件

关于这点,需要做点准备工作:

1、安装mysql:
sudo apt-get install mysql-server
2、安装库文件和头文件:
sudo apt-get install libmysqlclient-dev

也可以自己去官网下载对应mysql的安装包进行安装:http://dev.mysql.com/downloads/mysql/,单独下载connector的rpm或者tar包:http://dev.mysql.com/downloads/connector/。

如果是tar压缩包,解压出来,把include文件夹复制(cp命令,需root权限)到/usr/include/mysql/中,然后将lib文件夹复制到/usr/lib/mysql/中。

3、偶遇奇怪问题 fatal error: mysql/plugin_auth_common.h

这个问题其实不是什么大问题,是头文件引用的时候相对路径不对,如果编译器提示你某个头文件不存在,但是你在那个文件夹里查看又发现这个头文件其实是存在的。

比如说题述问题,我们在Linux下用C连mysql的时候要包含头文件:#include<mysql/mysql.h>,编译的时候编译器提示错误,<mysql/plugin_auth_common.h>不存在?

其实我们可以找到的是/usr/include/mysql/mysql/plugin_auth_common.h,然后,把该头文件复制到父级目录即可,编译器就能正确找到这个头文件。

其实都是相对路径的问题。

4、怎么用GCC命令正确编译:

比如写好的文件为main.c,转到文件所在目录(cd命令),然后进行编译,并尝试执行:

gcc -o conn main.c -l mysqlclient

chmod +x conn

./conn

如果不加-lmysqlclient 链接选项的话,一般会提示undefined reference to `mysql_init' ,其实是因为init是最开始被调用的函数,所以它就最先提示这个而已。

如果想要调试的话可以用gdb,不过我自己用得都不是很熟,所以就不多说了。

5、Eclipse(Kepler-Cpp)构建针对MySql的开发环境:

Project->Properties->Settings->Cross GCC Compiler->Includes->Include paths(-I),包含如下两个路径:

/usr/include/mysql和/usr/lib/mysql,如图:

然后在Cross GCC Linker->Libraries中的Libraries(-I)中添加link:mysqlclient,在Library search path(-L)中添加路径/usr/lib/mysql,如图:

本来一开始我是在QtCreator里面写的,编译的时候发现不知道哪里加-l mysqlclient这个链接选项,没办法,一点都不会用qmake,也不会用cmake,然后就想用Eclipse来写,然后又发现Eclipse没办法识别mysql的那些头文件,于是又折腾了一阵子。写倒不是问题,主要是这些IDE调试的时候比较方便(其实也主要是因为不太会用GDB),唉,各种碰壁。

二、大问题,如果你不小心把/usr/lib的所属用户改了导致sudo命令用不了:

这个不相关的问题是怎么来的?其实就是因为编译器提示某个头文件找不到,我以为是当前用户没权限去访问/usr/lib/mysql文件夹里面的库文件(这个文件夹是cp过去的,当时我也不清楚它的权限状态)。于是我把/usr/lib/mysql文件夹的所属用户改成了nerohwang,而且还重启了计算机,悲剧了。

重新进入系统以后,每次使用sudo命令的时候都提示,/usr/lib下的某文件出错,该文件的所属用户必须是UID为0的用户(其实就是root用户)。

可想而知,一个使用Linux系统的人无法通过sudo来获取root权限是什么感觉,感觉就是什么事情都做不了。没错,可以通过su命令来变成root用户,但是我是没有对root指定密码的,所以没有办法,甚至一度想过对系统进行重装(自杀)。

后来想到去Windows系统下用软碟通(UltrISO)写一个Ubuntu系统到U盘里,然后U盘启动以后选试用Ubuntu而不是安装。进到试用系统后,获取根用户权限(竟然不用密码),然后将原系统的那些文件权限恢复:

sudo su

cd /你平时用的Linux根目录的路径(桌面系统会帮你把这个系统挂载上,你可以点选以后通过右键--属性选项查看)

chown -R root:root /usr/lib

chown -R root:root /usr/include

上面所说的,桌面系统会帮你挂载那个分区,当然也可以自行挂载:

fdisk -l       -------查看分区情况,比如说我们发现那个系统分区在/dev/sda1上:

mount /dev/sda1 /mnt/DirName        --需要根用户权限

重启,进入系统,恢复正常。所以说,根目录的东西不要去乱搞。

三、C连接MySql编程本身:

其实这个最没什么好说的,不过最后还是写了个Demo 。

开始建表如下:

id为INT,主键,AUTO_INCREMENT,text为varchar(15)。

程序源码:

 /*Author:nerohwang
Date:2014/3/7*/
#include <stdio.h>
#include<stdlib.h>
#include<mysql/mysql.h>
#include<string.h>
#define INSERT_QUERY "INSERT INTO tblTest(text) values(?)"
void main(void)
{
size_t break_point = ;
printf("Hello World!\n");
MYSQL *conn;
MYSQL mysql;
MYSQL_RES *mysql_res;
MYSQL_ROW *mysql_row;
MYSQL_FIELD *mysql_field;
MYSQL_STMT *mysql_stmt;
unsigned int num_fields;
const char * server = "localhost";
const char *user = "root";
const char *passwd = "cc527888";
const char *dataBase = "dbTest";
const char *query_select = "select * from tblTest";
conn = mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,passwd,dataBase,,NULL,))
{
fprintf(stdout,"Error connecting to Mysql: %s\n",mysql_error(conn));
}
int t = mysql_query(conn,query_select);
if(t) //t=0 means correct
{
fprintf(stderr,"Query error occurs:%s\n",mysql_error(conn));
} mysql_res = mysql_use_result(conn);
if(mysql_res == NULL)
{
fprintf(stderr,"Query error occurs: %s!\n",mysql_error(conn));
}
num_fields = mysql_num_fields(mysql_res);
unsigned int num_rows = mysql_num_rows(mysql_res);
printf("There're %d columns in the table tblTest\n",num_fields);
//The code below won't return correct result until all rows in result_Set have been retieved
printf("There're %d rows affected in the table tblTest\n",num_rows);
mysql_field = mysql_fetch_fields(mysql_res);
unsigned int i=;
for(i=; i< num_fields; i++)
{
printf("Field %u is %s\t",i,mysql_field[i].name);
}
printf("\n");
size_t i_temp=;
while((mysql_row=mysql_fetch_row(mysql_res)))
{
printf("The ID %d is %s\n",++i_temp,mysql_row[]);
}
num_rows = mysql_num_rows(mysql_res);
printf("There're %d rows affected in the table tblTest\n",num_rows); //Now ,it's correct //Insert operation//////////////////////////////////////////////////////////////////////////
if(!(mysql_stmt=mysql_stmt_init(conn)))
{
fprintf(stderr,"Statement initialization failed: %s\n",mysql_stmt_error(mysql_stmt));
exit();
}
if(mysql_stmt_prepare(mysql_stmt,INSERT_QUERY,strlen(INSERT_QUERY))) //0 means correct
{
fprintf(stderr,"Statament preparation failed:%s and %s\n",mysql_error(conn),mysql_stmt_error(mysql_stmt));
exit();
}
fprintf(stdout,"Init and preparation succeeded!\n");
MYSQL_BIND bind[];
memset(bind, , sizeof(bind));
char *ch = "test_in";
int lengthCH = strlen(ch);
bind[].buffer_type = MYSQL_TYPE_VARCHAR;
bind[].buffer = ch;
bind[].is_null = ;
bind[].length = &lengthCH;
if (mysql_stmt_bind_param(mysql_stmt, bind))
{
fprintf(stderr, " mysql_stmt_bind_param() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(mysql_stmt));
exit();
} if(mysql_stmt_execute(mysql_stmt))
{
fprintf(stderr,"Execution failed:%s\n",mysql_stmt_error(mysql_stmt));
exit();
}
my_ulonglong affected_rows= mysql_stmt_affected_rows(mysql_stmt);
fprintf(stdout, " total affected rows(insert 1): %l\n",
(unsigned long) affected_rows); if (mysql_stmt_close(mysql_stmt))
{
fprintf(stderr, " failed while closing the statement\n");
fprintf(stderr, " %s\n", mysql_stmt_error(mysql_stmt));
exit();
}
//Insert opration success////////////////////////////////////////////////////////////
mysql_close(conn);
printf("End of the file\n");
}

C_Mysql

执行若干次以后结果如下:

写完,睡觉。

Linux下C连接MySql数据库的更多相关文章

  1. Linux下远程连接MySQL数据库

    估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privi ...

  2. linux下python3连接mysql数据库

    python语言的3.x完全不向前兼容,导致我们在python2.x中可以正常使用的库,到了python3就用不了了.比如说mysqldb 1.安装pymysql pymysql就是作为python3 ...

  3. Linux下自动备份MySQL数据库并上传到远程FTP服务器

    Linux下自动备份MySQL数据库并上传到远程FTP服务器且删除指定日期前的备份Shell脚本 说明:  1.备份MySQL数据库存放目录/var/lib/mysql下面的xshelldata数据库 ...

  4. Linux下定时备份MySQL数据库的Shell脚本

    Linux下定时备份MySQL数据库的Shell脚本   对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间 ...

  5. Linux下C++访问MySQL数据库

    由于想要开始了解并学习用LAMP进行web开发,所以昨晚我在Fedora上安装了MySQL,学习了MySQL的几个常用命令.想着在学习进行web开发(PHP访问数据库)之前,先用我熟悉的C++连接数据 ...

  6. Windows操作系统下远程连接MySQL数据库

    用Eclipse做一个后台项目,但是数据库不想放在本地电脑,于是买了一个腾讯云服务器(学生有优惠,挺便宜的),装上MySQL数据库,但是测试连接的时候,发现总是连接不是上,但是本地数据库可以连接,于是 ...

  7. linux 下C++查询mysql数据库

    上一节我们看了怎么使用mysql提供的API来连接mysql数据库,现在来看看怎么执行一条简单的查询语句,并且把查询的结果显示出来. 准备工作:首先新建了一个数据库inote,在这个数据库下面新建了一 ...

  8. Linux下C++连MySQL数据库

    1.查看本地有没有安装mysql,命令就是mysql,如果有这个命令就表示安装了mysql数据库软件.如果没有就自行安装. MySQL-server-4.0.16-0.i386.rpm MySQL-c ...

  9. Linux下如何启用MySQL数据库远程访问

    远程连接MySQL出于安全考虑,一般都关闭了远程访问,但有时候需要提供远程访问数据库的服务,下面我们快速学习下: 第一步:修改my.cnf文件使用文本编辑器去编辑MySQL服务器的配置文件my.cnf ...

随机推荐

  1. PHP疑难杂症

    下面这种写法是否允许? echo '\n' // \n echo "\n" // 输出换行 直接访问对象不存在的属性,会怎样? $o = new stdClass(); echo ...

  2. 云计算之路-阿里云上:对“黑色n秒”问题的最终猜想——CPU C-states引起的

    如果说2013年云计算之路的主题是“踩坑”,那么2014年我们希望云计算之路的主题变成“填坑”——当然填坑是阿里云来完成的,我们只是见证曾经的坑坑洼洼变成平坦大道. 15号(周四)晚上我们发现了SLB ...

  3. Android中可自由移动悬浮窗口的实现

    http://www.xsmile.net/?p=538   调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的ad ...

  4. initialize myObject by calling a function that returns an object literal

    w作用域控制变量的可见范围. JavaScript: The Good Parts Instead of initializing myObject with an object literal, w ...

  5. webpack4学习笔记(三)

    webpack打包资源文件 1,打包css文件,先安装css-loader和style-loader npm install --save-dev css-loader style-loader we ...

  6. Java实现断点续传

    原理: 断点续传的关键是断点,所以在制定传输协议的时候要设计好,如上图,我自定义了一个交互协议,每次下载请求都会带上下载的起始点,这样就可以支持从断点下载了,其实HTTP里的断点续传也是这个原理,在H ...

  7. 并发编程 - IO模型 - 1.io模型/2.阻塞io/3.非阻塞io/4.多路复用io

    1.io模型提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数同步不等于阻塞: 阻塞:遇到i ...

  8. Jumpserver使用

    堡垒机介绍 在一个特定网络环境下,为了保障网络和数据不受外界入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络活动,以便集中报警.及时处理及审计定责. 我们 ...

  9. linux服务器自动切割日志

    需求 由于nginx的日志会不停地增大,所以需要我们自己去切割日志,方便管理,需要达到以下的效果: 按日期自动切割日志,最小单位是天. 当日志总量超过一定量时,自动直接清理日志,限定总量不能超过100 ...

  10. 使用JCONSOLE远程监控JVM

    启动JMS服务 JConsole是从Java 5中开始引入的一个用于对JVM性能和资源消耗进行监控的图形化工具.JConsole可以连接本地的Java程序,也可以连接远程的Java程序.由于是GUI的 ...