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文件。

  1 不多说了,直接上代码,注释都很详细。
  2 /*
  3 * MySQLManager.h
  4 *
  5 *    Created on: Feb 18, 2009
  6 *            Author: Steven Wee
  7 */
  8
  9 #ifndef MYSQLMANAGER_H_
 10 #define MYSQLMANAGER_H_
 11
 12 #include "../Common/CheckStringTools.h"
 13
 14 #include < mysql.h>
 15
 16 #include < string>
 17 #include < iostream>
 18 #include < vector>
 19
 20 #include < string.h>
 21
 22 using namespace std;
 23
 24 class MySQLManager
 25 {
 26 public:
 27         /*
 28          * Init MySQL
 29          * @param hosts:         Host IP address
 30
 31          * @param userName:        Login UserName
 32          * @param password:        Login Password
 33          * @param dbName:        Database Name
 34          * @param port:                Host listen port number
 35          */
 36         MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);
 37         ~MySQLManager();
 38         void initConnection();
 39         /*
 40          * Making query from database
 41          * @param mysql:        MySQL Object
 42          * @param sql:                Running SQL command
 43          */
 44         bool runSQLCommand(std::string sql);
 45         /**
 46          * Destroy MySQL object
 47          * @param mysql                MySQL object
 48          */
 49         void destroyConnection();
 50         bool getConnectionStatus();
 51         vector<  vector< string> > getResult();
 52 protected:
 53         void setUserName(std::string userName);
 54         void setHosts(std::string hosts);
 55         void setPassword(std::string password);
 56         void setDBName(std::string dbName);
 57         void setPort(unsigned int port);
 58 private:
 59         bool IsConnected;
 60         vector<  vector< string> > resultList;
 61         MYSQL mySQLClient;
 62         unsigned int DEFAULTPORT;
 63         char * HOSTS;
 64         char * USERNAME;
 65         char * PASSWORD;
 66         char * DBNAME;
 67 };
 68
 69 #endif /* MYSQLMANAGER_H_ */
 70
 71 /*
 72 * MySQLManager.cpp
 73 *
 74 *    Created on: Feb 18, 2009
 75 *            Author: Steven Wee
 76 */
 77 #include "MySQLManager.h"
 78
 79 MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port)
 80
 81 {
 82         IsConnected = false;
 83         this ->setHosts(hosts);            //    设置主机IP地址
 84         this ->setUserName(userName);            //    设置登录用户名
 85         this ->setPassword(password);            //    设置登录密码
 86         this ->setDBName(dbName);            //    设置数据库名
 87         this ->setPort(port);            //    设置端口号
 88 }
 89
 90 MySQLManager::~MySQLManager()
 91 {
 92         this ->destroyConnection();
 93 }
 94
 95 void MySQLManager::setDBName(string dbName)
 96 {
 97         if ( dbName.empty() )
 98         {//        用户没有指定数据库名
 99                 std::cout < <  "DBName is null! Used default value: mysql" < <  std::endl;
100                 this ->DBNAME = new char[5];
101                 strcpy(this ->DBNAME, "mysql");
102         }
103         else
104         {
105                 this ->DBNAME = new char[dbName.length()];
106                 strcpy(this ->DBNAME, dbName.c_str());
107         }
108 }
109
110 void MySQLManager::setHosts(string hosts)
111 {
112         if ( hosts.empty() )
113         {//    用户没有指定数据库IP地址
114                 std::cout < <  "Hosts is null! Used default value: localhost" < <  std::endl;
115                 this ->HOSTS = new char[9];
116                 strcpy(this ->HOSTS, "localhost");
117         }
118         else
119         {
120                 this ->HOSTS = new char[hosts.length()];
121                 strcpy(this ->HOSTS, hosts.c_str());
122         }
123 }
124
125 void MySQLManager::setPassword(string password)
126 {//    用户没有指定密码
127         if ( password.empty() )
128         {
129
130                 std::cout < <  "Password is null! Used default value: " < <  std::endl;
131                 this ->PASSWORD = new char[1];
132                 strcpy(this ->PASSWORD, "");
133         }
134         else
135         {
136                 this ->PASSWORD = new char[password.length()];
137                 strcpy(this ->PASSWORD, password.c_str());
138         }
139 }
140
141 void MySQLManager::setPort(unsigned int port)
142 {//    用户没有指定端口号,使用默认端口号
143         if ( port )
144         {
145                 std::cout < <  "Port number is null! Used default value: 0" < <  std::endl;
146                 this ->DEFAULTPORT = 0;
147         }
148         else
149         {
150                 this ->DEFAULTPORT = port;
151         }
152 }
153
154 void MySQLManager::setUserName(string userName)
155 {//    用户没有指定登录用户名
156         if ( userName.empty() )
157         {
158                 std::cout < <  "UserName is null! Used default value: root" < <  std::endl;
159                 this ->USERNAME = new char[4];
160                 strcpy(this ->USERNAME, "root");
161         }
162         else
163         {
164                 this ->USERNAME = new char[userName.length()];
165                 strcpy(this ->USERNAME, userName.c_str());
166         }
167 }
168
169 void MySQLManager::initConnection()
170 {
171         if ( IsConnected )
172         {//    已经连接到服务器
173                 std::cout < <  "Is connected to server!" < < std::endl;
174                 return;
175         }
176         mysql_init(&mySQLClient);//    初始化相关对象
177         if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) )
178
179         {//    连接到服务器
180                 std::cout < <  "Error connection to database: %s\n" < <  mysql_error(&mySQLClient) < <  std::endl;
181         }
182         IsConnected = true;//    修改连接标识
183 }
184
185 bool MySQLManager::runSQLCommand(string sql)
186 {
187         if ( !IsConnected )
188         {//    没有连接到服务器
189                 std::cout < <  "Not connect to database!" < <  std::endl;
190                 return false;
191         }
192         if ( sql.empty() )
193         {//    SQL语句为空
194                 std::cout < <  "SQL is null!" < <  std::endl;
195                 return false;
196         }
197
198         MYSQL_RES *res;
199         MYSQL_ROW row;
200
201         unsigned int i,j = 0;
202
203         StringTools stringTools;
204         sql = stringTools.filterString(sql);
205
206         i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));//    执行查询
207         if ( i )
208         {
209                 std::cout < <  "Error query from database: %s\n" < <  mysql_error(&mySQLClient) < <  std::endl;
210                 return false;
211         }
212         res = mysql_store_result(&mySQLClient);
213         vector< string> objectValue;
214         while( (row = mysql_fetch_row(res)) )
215         {//    遍历结果集
216                 objectValue.clear();
217                 for ( j = 0 ; j <  mysql_num_fields(res) ; j   )
218                 {
219                         objectValue.push_back(row[j]);
220                 }
221                 this ->resultList.push_back(objectValue);
222         }
223         mysql_free_result(res);         //free result after you get the result
224
225
226
227         return true;
228 }
229
230 vector<  vector< string> > MySQLManager::getResult()
231 {
232         return resultList;
233 }
234
235 void MySQLManager::destroyConnection()
236 {
237         mysql_close(&mySQLClient);
238         this ->IsConnected = false;
239 }
240
241 bool MySQLManager::getConnectionStatus()
242 {
243         return IsConnected;
244 } 

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

时间: 2024-11-05 14:49:06

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

记一次MySQL找回用户数据

事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出结论:本来只需要更新微信号的,结果我们公司的流程系统管理员把用户先删除,再创建了新的用户. 解决过程 1.首先想到的是直接从定时备份数据里面找回原来的用户ID,结果发现系统只备份了十天的记录,而工作流系统上显示销售C只有8月3号以后的流程记录,距今已经40多天,从自动备份的数据里已经无法恢复. 2.

centos7下使用yum安装mysql

CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2. 安装mysql-community-release-el7-5.noarch.rpm包 $ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm 安装这个

EF+mvc+mysql

这个真是一个大坑啊.TM折腾了一下午终于弄好了.赶紧记录下来分享给大家,免得有和我一样一直配置不成功的又折腾半天-.1.安装MySQL for Visual Studio这个直接在mysql官网下载并安装就好了.不过这个必须是vs2013 professional版本以上才可以!!2.安装MySQL Connector/Net这个可以可以通过NuGet工具获得,比较轻松愉快,当然你也可以自己下载,自己引用.3.配置web.config.首先是connectionStrings节点 1 <conn

Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!

问题: 在普通用户权限下执行 mysql -u root -p进入mysql数据库,中间步骤省略,插入数据:insert into 库名(属性)values('汉字'); 会出现如下提示:  Query OK, 1 row affected, 1 warning (0.00 sec)    表明出现错误,没有插入成功,然后执行select * from 表名   就会出现如下的问题:显示的表中出现乱码或者问号. 如图: 解决方案: 首先重新打开一个终端窗口(方便操作),进入root用户模式 执行

Centos6.5 zabbix3.2.6监控mysql

  一.     操作环境 我使用的linux系统是centos6.5,数据库是mysql5.6,apache2.4,php5,6 安装目录: /usr/local/apache /usr/local/php /usr/local/mysql /usr/local/zabbix Zabbix服务器插件安装 Zabbix3.2.6自带监控mysql模板监控项不全面,所以重新下载导入到zabbix里面 下载网址:. https://www.percona.com/downloads/percona-

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

Mac配置Mysql遇到的 --secure-file-priv问题

1.安装mysql 在官网上安装,一步步无障碍安装(但根据后来文件入法导入/导出的经验,最好在安装前设置secure-file-priv为empty,5.7.6之后似乎就默认为NULL,而secure-file-prive为NULL的话,就不支持文件导入/出) 2.安装navicat premimum 在网上找到一个破解版,按照破解步骤来安装,很好用 3.遇到的问题:在将选择的记录导出到.csv文件时,出现提示"The MySQL server is running with the --sec

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1)创建数据表suppliers 前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应. 也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系. 其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中

MySQL 警告WARN: Establishing SSL connection without server&#39;s identity verification is not recommended.解决办法

Success loading Mysql Driver!Mon Apr 04 15:43:00 CST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by d