看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂。写这篇文章的目的不是别的,就一个,告诉您用MySQL的C API直接操作MySQL数据,并做了比较高效的封装,可以帮助开发人员大幅度提高采用MySQL的C API操作MySQL数据库的效率。
直接进入主题:
 
准备工作我就不介绍了,请参考上一篇博客:http://www.cnblogs.com/mlgjb/p/8798361.html
 
在工程建立添加以下两个文件:
第一个文件头文件:VspdCTOMySQL.h
/****************************MYSQL IN C*******************************/
/*************************2007 -03 -07 *******************************/
/*************************李克喜**************************************/ #include <stdio.h>
#include <string>
#include <afxsock.h>
#include "mysql.h"
using namespace std;
class VspdCToMySQL
{
public: //变量
MYSQL mysql; /*
构造函数和稀构函数
*/
VspdCToMySQL();
~VspdCToMySQL(); /*
主要的功能:
初始化数据库
连接数据库
设置字符集 入口参数:
host :MYSQL服务器IP
port:数据库端口
Db:数据库名称
user:数据库用户
passwd:数据库用户的密码
charset:希望使用的字符集
Msg:返回的消息,包括错误消息 出口参数:
int :0表示成功;1表示失败
*/
int ConnMySQL(char *host,char * port,char * Db,char * user,char* passwd,char * charset,char * Msg); /*
主要的功能:
查询数据 入口参数:
SQL:查询的SQL语句
Cnum:查询的列数
Msg:返回的消息,包括错误消息 出口参数:
string 准备放置返回的数据,多条记录则用0x06隔开,多个栏位用0x05隔开
如果 返回的长度= 0,责表示舞结果
*/
string SelectData(char * SQL,int Cnum ,char * Msg); /*
主要功能:
插入数据 入口参数
SQL:查询的SQL语句
Msg:返回的消息,包括错误消息 出口参数:
int :0表示成功;1表示失败
*/
int InsertData(char * SQL,char * Msg); /*
主要功能:
修改数据 入口参数
SQL:查询的SQL语句
Msg:返回的消息,包括错误消息 出口参数:
int :0表示成功;1表示失败
*/
int UpdateData(char * SQL,char * Msg); /*
主要功能:
删除数据 入口参数
SQL:查询的SQL语句
Msg:返回的消息,包括错误消息 出口参数:
int :0表示成功;1表示失败
*/
int DeleteData(char * SQL,char * Msg); /*
主要功能:
关闭数据库连接
*/
void CloseMySQLConn(); };
 
 
第二个文件实现文件:VspdCTOMySQL.cpp
/****************************MYSQL IN C*******************************/
/*************************2007 -03 -07 *******************************/
/*************************李克喜**************************************/ #include "stdafx.h"
#include "VspdCTOMySQL.h" VspdCToMySQL::VspdCToMySQL()
{
} VspdCToMySQL::~VspdCToMySQL()
{
} //初始化数据
int VspdCToMySQL::ConnMySQL(char *host,char * port ,char * Db,char * user,char* passwd,char * charset,char * Msg)
{
if( mysql_init(&mysql) == NULL )
{
Msg = "inital mysql handle error";
return ;
} if (mysql_real_connect(&mysql,host,user,passwd,Db,,NULL,) == NULL)
{
Msg = "Failed to connect to database: Error";
return ;
} if(mysql_set_character_set(&mysql,"GBK") != )
{
Msg = "mysql_set_character_set Error";
return ;
}
return ;
} //查询数据
string VspdCToMySQL::SelectData(char * SQL,int Cnum,char * Msg)
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[];
sprintf(sql,SQL);
int rnum = ;
char rg = 0x06;//行隔开
char cg = {0x05};//字段隔开 if(mysql_query(&mysql,sql) != )
{
Msg = "select ps_info Error";
return "";
}
m_res = mysql_store_result(&mysql); if(m_res==NULL)
{
Msg = "select username Error";
return "";
}
string str("");
while(m_row = mysql_fetch_row(m_res))
{
for(int i = ;i < Cnum;i++)
{
str += m_row[i];
str += rg;
}
str += rg;
rnum++;
} mysql_free_result(m_res); return str;
}
 
 
//插入数据
int VspdCToMySQL::InsertData(char * SQL,char * Msg)
{
char sql[];
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != )
{
Msg = "Insert Data Error";
return ;
}
return ;
}
 
//更新数据
int VspdCToMySQL::UpdateData(char * SQL,char * Msg)
{
char sql[];
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != )
{
Msg = "Update Data Error";
return ;
}
return ;
}
//删除数据
int VspdCToMySQL::DeleteData(char * SQL,char * Msg)
{
char sql[];
sprintf(sql,SQL);
if(mysql_query(&mysql,sql) != )
{
Msg = "Delete Data error";
return ;
}
return ;
}
//关闭数据库连接
void VspdCToMySQL::CloseMySQLConn()
{
mysql_close(&mysql);
}
 
 
在main函数,(如果是其他工程级不是main了,可能是一个按钮里面的代码块)添加      一些代码,添加之后如下
#include "stdafx.h"
#include "VspdCTOMySQL.h" int main(int argc, char* argv[])
{
char* host="MYSQL服务器IP";
char* user="root";
char* port ="";
char* passwd="用户密码";
char* dbname="数据库名称";
char* charset = "GBK";//支持中文
char* Msg = "";//消息变量
//初始化
VspdCToMySQL * vspdctomysql = new VspdCToMySQL;
if(vspdctomysql->ConnMySQL(host,port,dbname,user,passwd,charset,Msg) == )
printf("连接成功/r/n");
else
printf(Msg); //查询
char * SQL = "SELECT ids,username,passwd,address FROM vcaccesstest";
string str = vspdctomysql->SelectData(SQL,,Msg);
if( str.length() > )
{
printf("查询成功/r/n");
printf(str.data());
printf("/r/n");
}
else
{
printf(Msg);
}
//插入
SQL = "insert into vcaccesstest(ids,username,passwd,address) values(4,'我的','123210','测试地址')";
if(vspdctomysql->InsertData(SQL,Msg) == )
printf("插入成功/r/n");
//更新
SQL = "update vcaccesstest set username = '修改了',passwd='2345' where ids = 3 ";
if(vspdctomysql->UpdateData(SQL,Msg) == )
printf("更新成功/r/n");
//删除
SQL = "delete from vcaccesstest where ids = 3 ";
if(vspdctomysql->DeleteData(SQL,Msg) == )
printf("删除成功/r/n"); vspdctomysql->CloseMySQLConn(); return ;
}
 
数据库表确认表存在,(程序中的表和字段是我的数据库里面的内容,你要自己搞定你的SQL语句了,你可以看main函数里面的SQL变量的内容。
补充:
在上面的例子中sql语句是对常量进行操作的,比较简单,但是如果对变量进行操作就比较麻烦了
基本思路为:1、将这些变量用字符串的形式连接起来,如果里面含有数值变量还要将先转换为字符串的形式。2、再考虑逗号与单引号的问题(在sql语句中,字符串需要用单引号括起来)。
在C语言中,将数字转换成字符串和连接字符串这两项功能都可以用sprintf()函数实现。
 
编译,运行,一切ok。
总结,你要做的事情很少了,两个主要的文件写好了,你看例子调用即可,其他MySQL的库文件和附加文件别人也为您准备好了,移植到其他系统也是很简单的,比如移植到Linux和Unix下也是很简单的,VspdCTOMySQL.h和VspdCTOMySQL.cpp基本上是采用标准的C++编写的,在别的系统可能需要做少量修改即可。

原文传送门:https://blog.csdn.net/jemlee2002/article/details/1523164

c++读写MySQL的更多相关文章

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

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

  2. shell中读写mysql数据库

    本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...

  3. R语言使用RMySQL连接及读写Mysql数据库 测试通过

    R语言使用RMySQL连接及读写Mysql数据库 简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2 ...

  4. JDBC读写MySQL的大字段数据

    JDBC读写MySQL的大字段数据   不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...

  5. spark读写mysql

    spark读写mysql除官网例子外还要指定驱动名称 travels.write .mode(SaveMode.Overwrite) .format("jdbc") .option ...

  6. kettle大数据量读写mysql性能优化

       修改kettleDB连接设置 1. 增加批量写的速度:useServerPrepStmts=false  rewriteBatchedStatements=true  useCompressio ...

  7. R语言使用RMySQL连接及读写Mysql数据库

    简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2.el6.x86_64 系统编码:LANG=zh_ ...

  8. Spark学习笔记——读写MySQL

    1.使用Spark读取MySQL中某个表中的信息 build.sbt文件 name := "spark-hbase" version := "1.0" scal ...

  9. C++ 读写MySQL经典 (转载)

    from: http://blog.csdn.net/jemlee2002/article/details/1523164   看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一 ...

随机推荐

  1. 码农、黑客和2B程序员之间的区别

    码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L<<32 ...

  2. PHP冒泡排序、选择排序、插入排序

    $arr = [1, 8, 7, 5, 4, 2, 11, 9, 20]; 冒泡排序: for ($i = 0; $i < count($arr); $i ++) { for ($j = 0; ...

  3. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  4. hadoop大数据技术架构详解

    大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展.高效率.高可靠等优点越来越受到欢迎.这同时也带动了 ...

  5. Kompose: Docker-compose 到 Kubernetes 的迁移工具

    Docker 让每个人都能够从 Docker Registry 启动一个打包好的 Docker 应用.Docker-Compose在Docker基础上解决了多容器应用之间的依赖启动问题. Docker ...

  6. Spring Security 入门(3-10)Spring Security 的四种使用方式

    原文链接: http://www.360doc.com/content/14/0724/17/18637323_396779659.shtml 下面是作者的一个问题处理

  7. 一大波 Android 刘海屏来袭,全网最全适配技巧!

    一.序 Hi,大家好,我是承香墨影! Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议.不过不管你怎样,Android 也要跻入 &q ...

  8. 更换yum源

    1. 首先备份 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 使用阿里云的 ...

  9. 关于ECMAScript 2016, 2017, 和2018中新增功能(摘抄)

    ECMAScript 2016 1. Array.prototype.includes includes是数组上的简单实例方法,并有助于轻松查找某个项是否在Array中(包括NaN不像indexOf) ...

  10. php文件包含漏洞(input与filter)

    php://input php://input可以读取没有处理过的POST数据.相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置.php:/ ...