C/C++使用MySQL
一直找不到关于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的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
随机推荐
- ado.net 参数传递之 in
之前项目有一放行的功能,对某界面维护时(数据的增删改),先将数据保存到临时表中,放行后再真正的写入到库中.由于设计到主从表多中约束关系,所以当时我采用的是写一个存储过程来对某个界面的操作进行统一处理, ...
- Jenkins初识
Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 功能 Jenkins功能包括 ...
- Windows系统安装pip方法
pip是一款非常方便的python包管理工具,本文主要介绍在windows 10系统下安装pip方法. 1. 下载pip 地址:https://pypi.python.org/pypi/pip#dow ...
- CORS跨域请求之简单请求与非简单请求
先来看一个例子 定义server01的项目,在路由表中添加一条路由记录 url(r'^getData.html$',views.get_data) 对应的视图函数 from django.shortc ...
- 序列化和反序列化及Protobuf 基本使用
序列化和反序列化 序列化和反序列化在平常工作中会大量使用,然而并不一定非常清楚它的概念.序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.机器间的通信需要 ...
- BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]
2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...
- 自用最小生成树模板(基于Kruskal)
200ms的板子,我尽力了,以我自己的能力没法再快了... 基于Kruskal的做法,跑了200ms,以我自己的能力没办法再快了,不过翻了几页评测列表发现我是最快的...我觉得应该会有更快的方法.想法 ...
- python数据分析工具包(2)——Numpy(二)
上一篇文章简单地介绍了numpy的一些基本数据类型,以及生成数组和矩阵的操作.下面我们来看一下矩阵的基本运算.在线性代数中,常见的矩阵运算包括,计算行列式.求逆矩阵.矩阵的秩等.下面我们来一一实现. ...
- ManagementObjectSearcher Path
为了获取硬件信息,你还需要创建一个ManagementObjectSearcher 对象.ManagementObjectSearcher searcher = new ManagementObjec ...
- MathJax使用指南
MathJax使用指南 SublimePrettyJson Github CSDN-Markdown语法集锦 LaTex 简明教程 在Markdown中输入数学公式(MathJax) MathJax ...