一直找不到关于C/C++连接Mysql数据库的详细api书籍和网站,刷了下网页,找到一篇Linux 下C/C++连接数据库的博客,留着以后自己用。

  首先需要编译、安装MySQL,安装完成后,将MySQL目录中的lib目录添加到环境变量中。新建C/C  工程,把$MYSQL_ROOT/include添加到编译环境的包含路径下面。在编译选项中,增加$MYSQL_ROOT/lib目录。在Link选项中增加-lmysqlclient(已经把lib目录增加到系统环境变量中),或者直接引用libmysqlclient.so文件。

 不多说了,直接上代码,注释都很详细。
/*
* MySQLManager.h
*
* Created on: Feb 18, 2009
* Author: Steven Wee
*/ #ifndef MYSQLMANAGER_H_
#define MYSQLMANAGER_H_ #include "../Common/CheckStringTools.h" #include < mysql.h> #include < string>
#include < iostream>
#include < vector> #include < string.h> using namespace std; class MySQLManager
{
public:
/*
* Init MySQL
* @param hosts: Host IP address * @param userName: Login UserName
* @param password: Login Password
* @param dbName: Database Name
* @param port: Host listen port number
*/
MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);
~MySQLManager();
void initConnection();
/*
* Making query from database
* @param mysql: MySQL Object
* @param sql: Running SQL command
*/
bool runSQLCommand(std::string sql);
/**
* Destroy MySQL object
* @param mysql MySQL object
*/
void destroyConnection();
bool getConnectionStatus();
vector< vector< string> > getResult();
protected:
void setUserName(std::string userName);
void setHosts(std::string hosts);
void setPassword(std::string password);
void setDBName(std::string dbName);
void setPort(unsigned int port);
private:
bool IsConnected;
vector< vector< string> > resultList;
MYSQL mySQLClient;
unsigned int DEFAULTPORT;
char * HOSTS;
char * USERNAME;
char * PASSWORD;
char * DBNAME;
}; #endif /* MYSQLMANAGER_H_ */ /*
* MySQLManager.cpp
*
* Created on: Feb 18, 2009
* Author: Steven Wee
*/
#include "MySQLManager.h" MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port) {
IsConnected = false;
this ->setHosts(hosts); // 设置主机IP地址
this ->setUserName(userName); // 设置登录用户名
this ->setPassword(password); // 设置登录密码
this ->setDBName(dbName); // 设置数据库名
this ->setPort(port); // 设置端口号
} MySQLManager::~MySQLManager()
{
this ->destroyConnection();
} void MySQLManager::setDBName(string dbName)
{
if ( dbName.empty() )
{// 用户没有指定数据库名
std::cout < < "DBName is null! Used default value: mysql" < < std::endl;
this ->DBNAME = new char[];
strcpy(this ->DBNAME, "mysql");
}
else
{
this ->DBNAME = new char[dbName.length()];
strcpy(this ->DBNAME, dbName.c_str());
}
} void MySQLManager::setHosts(string hosts)
{
if ( hosts.empty() )
{// 用户没有指定数据库IP地址
std::cout < < "Hosts is null! Used default value: localhost" < < std::endl;
this ->HOSTS = new char[];
strcpy(this ->HOSTS, "localhost");
}
else
{
this ->HOSTS = new char[hosts.length()];
strcpy(this ->HOSTS, hosts.c_str());
}
} void MySQLManager::setPassword(string password)
{// 用户没有指定密码
if ( password.empty() )
{ std::cout < < "Password is null! Used default value: " < < std::endl;
this ->PASSWORD = new char[];
strcpy(this ->PASSWORD, "");
}
else
{
this ->PASSWORD = new char[password.length()];
strcpy(this ->PASSWORD, password.c_str());
}
} void MySQLManager::setPort(unsigned int port)
{// 用户没有指定端口号,使用默认端口号
if ( port )
{
std::cout < < "Port number is null! Used default value: 0" < < std::endl;
this ->DEFAULTPORT = ;
}
else
{
this ->DEFAULTPORT = port;
}
} void MySQLManager::setUserName(string userName)
{// 用户没有指定登录用户名
if ( userName.empty() )
{
std::cout < < "UserName is null! Used default value: root" < < std::endl;
this ->USERNAME = new char[];
strcpy(this ->USERNAME, "root");
}
else
{
this ->USERNAME = new char[userName.length()];
strcpy(this ->USERNAME, userName.c_str());
}
} void MySQLManager::initConnection()
{
if ( IsConnected )
{// 已经连接到服务器
std::cout < < "Is connected to server!" < < std::endl;
return;
}
mysql_init(&mySQLClient);// 初始化相关对象
if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, ) ) {// 连接到服务器
std::cout < < "Error connection to database: %s\n" < < mysql_error(&mySQLClient) < < std::endl;
}
IsConnected = true;// 修改连接标识
} bool MySQLManager::runSQLCommand(string sql)
{
if ( !IsConnected )
{// 没有连接到服务器
std::cout < < "Not connect to database!" < < std::endl;
return false;
}
if ( sql.empty() )
{// SQL语句为空
std::cout < < "SQL is null!" < < std::endl;
return false;
} MYSQL_RES *res;
MYSQL_ROW row; unsigned int i,j = ; StringTools stringTools;
sql = stringTools.filterString(sql); i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));// 执行查询
if ( i )
{
std::cout < < "Error query from database: %s\n" < < mysql_error(&mySQLClient) < < std::endl;
return false;
}
res = mysql_store_result(&mySQLClient);
vector< string> objectValue;
while( (row = mysql_fetch_row(res)) )
{// 遍历结果集
objectValue.clear();
for ( j = ; j < mysql_num_fields(res) ; j )
{
objectValue.push_back(row[j]);
}
this ->resultList.push_back(objectValue);
}
mysql_free_result(res); //free result after you get the result return true;
} vector< vector< string> > MySQLManager::getResult()
{
return resultList;
} void MySQLManager::destroyConnection()
{
mysql_close(&mySQLClient);
this ->IsConnected = false;
} bool MySQLManager::getConnectionStatus()
{
return IsConnected;
}

来自:http://club.topsage.com/forum.php?mod=viewthread&tid=2129419

C/C++使用MySQL的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. docker之NGINX镜像构建

    Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:1.作为Web服务器.2.作为负载均衡服务器.3.作为邮件代理服务器.4.安装及配置简单.接下来我们介绍在docker构建ng ...

  2. javascript中this指向问题

    本文参考http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html this是JavaScript的一个关 ...

  3. 1.Tarball软件make与makefile详解(还需要补充)

    *通常自己安装的软件放在 /usr/local/软件名   中,而将源文件放在/usr/local/src *为安装到单独目录的软件之 man page 加入 man path 搜寻: 如果你安装的软 ...

  4. FBReader阅读引擎支持的功能

    "三十年河东,三十年河西"是一句民间谚语,它的来源是:从前黄河河道不固定,经常会改道(历史上无数次发生).某个地方原来在河的东面,若干年后,因黄河水流改道,这个地方会变为在河的西面 ...

  5. VSFTPD 源码安装升级

    /usr/local/sbin/vsd -v cp /usr/local/sbin/vsd /usr/sbin/vsd 制作启动脚本 vim /etc/xinetd.d/vsd disable = y ...

  6. easyUI---datagrid合并单元格代码实现

    1.html部分: <div id="table1"></div> 2.js部分: $('#table1').datagrid({ data : data, ...

  7. 三栏布局,div左右盒子是定宽,中间是自适应

    用弹性布局flex: 给父盒子加个display:flex; 给中间盒子设flex=1; /* 弹性盒子布局*/ .wrap{ width: 100%; height: 90px; display: ...

  8. 济南清北学堂游记 Day 6.

    还剩一天半我就该回去了. 说实话今天挺可惜的,有很多本来可以得到的分数评测时没有拿到.上午的第一题和第二题我都想出了正解,T3敲了一个暴力,虽然暴力写坏了.预计是可以拿210的但是实际上只有很少的分数 ...

  9. HibernateTemplate#setMaxResults()的坑

    如题所示,因为maxResults为实例属性,一经修改,则会应用于所有查询! 不是很清楚,Spring为什么要挖这个坑? 我的解决方案:如需设置返回结果集的大小,则通过HibernateCallbac ...

  10. webstorm你不知道的秘密

    相信你们用webstorm肯定都会用上下面介绍的Emmet插件这个可以自带的哦 Emmet语法 子代:> 兄弟:+ 父代:^ 重复:* 成组:() ID:# class:. 属性:[] 编号:$ ...