Linux下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数据库的更多相关文章
- Linux下远程连接MySQL数据库
估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privi ...
- linux下python3连接mysql数据库
python语言的3.x完全不向前兼容,导致我们在python2.x中可以正常使用的库,到了python3就用不了了.比如说mysqldb 1.安装pymysql pymysql就是作为python3 ...
- Linux下自动备份MySQL数据库并上传到远程FTP服务器
Linux下自动备份MySQL数据库并上传到远程FTP服务器且删除指定日期前的备份Shell脚本 说明: 1.备份MySQL数据库存放目录/var/lib/mysql下面的xshelldata数据库 ...
- Linux下定时备份MySQL数据库的Shell脚本
Linux下定时备份MySQL数据库的Shell脚本 对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间 ...
- Linux下C++访问MySQL数据库
由于想要开始了解并学习用LAMP进行web开发,所以昨晚我在Fedora上安装了MySQL,学习了MySQL的几个常用命令.想着在学习进行web开发(PHP访问数据库)之前,先用我熟悉的C++连接数据 ...
- Windows操作系统下远程连接MySQL数据库
用Eclipse做一个后台项目,但是数据库不想放在本地电脑,于是买了一个腾讯云服务器(学生有优惠,挺便宜的),装上MySQL数据库,但是测试连接的时候,发现总是连接不是上,但是本地数据库可以连接,于是 ...
- linux 下C++查询mysql数据库
上一节我们看了怎么使用mysql提供的API来连接mysql数据库,现在来看看怎么执行一条简单的查询语句,并且把查询的结果显示出来. 准备工作:首先新建了一个数据库inote,在这个数据库下面新建了一 ...
- Linux下C++连MySQL数据库
1.查看本地有没有安装mysql,命令就是mysql,如果有这个命令就表示安装了mysql数据库软件.如果没有就自行安装. MySQL-server-4.0.16-0.i386.rpm MySQL-c ...
- Linux下如何启用MySQL数据库远程访问
远程连接MySQL出于安全考虑,一般都关闭了远程访问,但有时候需要提供远程访问数据库的服务,下面我们快速学习下: 第一步:修改my.cnf文件使用文本编辑器去编辑MySQL服务器的配置文件my.cnf ...
随机推荐
- Struts文件下载(静态)
前言:在实际的开发中,我们可能需要动态下载和静态下载, 动态下载:例如我上传了一个文件,你想下载,那就必须动态生成下载链接,因为我服务器一开始是不知道我上传的东西是什么,放在那里, 静态下载:比如一些 ...
- Spoken English Practice(1、This is between you and me, Don't let it out. 2、Don't let your dreams be dreams, no matter how hard it gets, say to yourself, I'm going to make it.)
绿色:连读: 红色:略读: 蓝色:浊化: 橙色:弱读 下划线_为浊化 口语蜕变(2017/7/12) ...
- 常用移动web开发框架--转载
阅读目录 1.1 jQuery mobile flat-ui 主题 1.2jQuery mobile Bootstrap 主题 4.1 GMU 4.2 Clouda+ 4.3 efe 5.1 Sp ...
- 荣誉墙项目day28 django常用函数
1.在网页上渲染字符串from django.http import HttpResponsereturn HttpResponse(u"hello world") 2.渲染网页f ...
- Robberies---hdu2955(概率dp,01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题目给了每个银行的钱和被抓的概率,由于要抢尽量多的钱,所以要保证尽量不被抓,而抢多个银行之后不被 ...
- javascript 之 valueOf
var m = { i:10, toString:function () { console.log('toString'); return this.i; }, valueOf:function ( ...
- Linux ssh服务
关于ssh服务不多说就提几句,1,机房的服务器一般都是通过远程连接登录的,远程登录就必然少不了ssh客户端.2,虚拟机每次都要点击进去,每次退出来也需要按Ctrl+Alt+Enter,也比较麻烦,有时 ...
- 前端 javascript 数据类型 字典
定义字典 a = {"k1":"v1","k2":"v2",}; Object {k1: "v1", ...
- golang在线手册汇总
1. golang官网 https://golang.org/ 2. golang中国 http://www.golangtc.com/ http://godoc.golangtc.com/pkg/ ...
- 工作笔记——dom属性巧用
1.获取验证码 dom: <span class="btn btn-primary">获取验证码</span> js: /** *@Author Mona ...