看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂。写这篇文章的目的不是别的,就一个,告诉您用MySQL的C API直接操作MySQL数据,并做了比较高效的封装,可以帮助开发人员大幅度提高采用MySQL的C API操作MySQL数据库的效率。
直接进入主题:
1、  准备工作
MySQL数据库安装之后在/MySQL Server 5.0/lib/opt目录下有所需要的各种文件,我们需要的只是以下几个:
libmysql.lib
libmysql.dll
同时需要/MySQL Server 5.0/include目录下的几个文件:
mysql_version.h
my_list.h
mysql_com.h
mysql_time.h
mysql.h
my_alloc.h
typelib.h
 
准备Socket的基本文件
在VC的安装目录Microsoft Visual Studio/VC98/Lib下找到:
WS2_32.LIB
 
把这些文件先准备好
 
2、  使用VC的AppWizard建立一个Win32 Console Application,其实可以是Dialog工程或是其他类型工程,比如工程取名CMySQL
3、  把刚才准备好的文件拷贝你的工程目录下,和普通的CPP文件在同一个目录即可
4、  建立之后,在VC的菜单栏点击Project(项目)->Settings(设置),弹出对话框,选择Link标签进入Link设置,在Object/library modules 的框里面加入
libmysql.lib[有个空格]WS2_32.LIB
5、    在工程建立添加以下两个文件:
第一个文件头文件: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 1;
       }    
 
       if (mysql_real_connect(&mysql,host,user,passwd,Db,0,NULL,0) == NULL)
       {
              Msg = "Failed to connect to database: Error";
              return 1;
       }    
 
       if(mysql_set_character_set(&mysql,"GBK") != 0)
       {
              Msg = "mysql_set_character_set Error";
              return 1;
       }
       return 0;
}
 
//查询数据
string VspdCToMySQL::SelectData(char * SQL,int Cnum,char * Msg)
{
       MYSQL_ROW m_row;
    MYSQL_RES *m_res;
    char sql[2048];
    sprintf(sql,SQL);
       int rnum = 0;
       char rg = 0x06;//行隔开
       char cg = {0x05};//字段隔开
 
       if(mysql_query(&mysql,sql) != 0)
       {
              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 = 0;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[2048];
    sprintf(sql,SQL);
       if(mysql_query(&mysql,sql) != 0)
       {
              Msg = "Insert Data Error";
              return 1;
       }
       return 0;
}
 
//更新数据
int VspdCToMySQL::UpdateData(char * SQL,char * Msg)
{
       char sql[2048];
    sprintf(sql,SQL);
       if(mysql_query(&mysql,sql) != 0)
       {
              Msg = "Update Data Error";
              return 1;
       }
       return 0;
}
 
//删除数据
int VspdCToMySQL::DeleteData(char * SQL,char * Msg)
{
       char sql[2048];
    sprintf(sql,SQL);
       if(mysql_query(&mysql,sql) != 0)
       {
              Msg = "Delete Data error";
              return 1;
       }
       return 0;
}
 
//关闭数据库连接
void VspdCToMySQL::CloseMySQLConn()
{
       mysql_close(&mysql);
}
 
 
6、 在main函数,(如果是其他工程级不是main了,可能是一个按钮里面的代码块)添加      一些代码,添加之后如下:
#include "stdafx.h"
#include "VspdCTOMySQL.h"
 
int main(int argc, char* argv[])
{
    char* host="MYSQL服务器IP";
    char* user="root";
    char* port ="3306";
    char* passwd="用户密码";
    char* dbname="数据库名称"; 
    char* charset = "GBK";//支持中文
    char* Msg = "";//消息变量
    //初始化
    VspdCToMySQL * vspdctomysql = new VspdCToMySQL;
    if(vspdctomysql->ConnMySQL(host,port,dbname,user,passwd,charset,Msg) == 0)
           printf("连接成功/r/n");
    else
           printf(Msg);
   
    //查询
    char * SQL = "SELECT ids,username,passwd,address FROM vcaccesstest";
    string str = vspdctomysql->SelectData(SQL,4,Msg);
    if( str.length() > 0 )
    {
           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) == 0)
           printf("插入成功/r/n");
    //更新
    SQL = "update vcaccesstest set username = '修改了',passwd='2345' where ids = 3 ";
    if(vspdctomysql->UpdateData(SQL,Msg) == 0)
           printf("更新成功/r/n");
    //删除
    SQL = "delete from vcaccesstest where ids = 3 ";
    if(vspdctomysql->DeleteData(SQL,Msg) == 0)
           printf("删除成功/r/n");
 
    vspdctomysql->CloseMySQLConn();
 
    return 0;
}
 
 7、 数据库表确认表存在,(程序中的表和字段是我的数据库里面的内容,你要自己搞定你的SQL语句了,你可以看main函数里面的SQL变量的内容。
8、 编译,运行,一切ok。
9、 总结,你要做的事情很少了,两个主要的文件写好了,你看例子调用即可,其他MySQL的库文件和附加文件别人也为您准备好了,移植到其他系统也是很简单的,比如移植到Linux和Unix下也是很简单的,VspdCTOMySQL.h和VspdCTOMySQL.cpp基本上是采用标准的C++编写的,在别的系统可能需要做少量修改即可。

C++ 读写MySQL经典 (转载)的更多相关文章

  1. 【不断更新】mysql经典50道题自我练习

    mysql经典50道题自我练习 测试数据和练习题均转载自CSDN博主@启明星的指引的文章sql语句练习50题(Mysql版),用于mysql的每日自我练习 表名和字段 –1.学生表 Student(s ...

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

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

  3. shell中读写mysql数据库

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

  4. 10 个 MySQL 经典错误【转】

    Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 mysql> show variables like '%max_connec ...

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

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

  6. 数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

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

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

  8. spark读写mysql

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

  9. MYSQL经典练习题,熟悉DQL

    MYSQL经典练习题 (本练习题可让你熟悉DQL,快速的上手DQL) 首先,先在数据库中建立基本数据库以及表项: DROP DATABASE IF EXISTS `test`; CREATE DATA ...

随机推荐

  1. java for语句

    //for语句 public class Test16{ public static void main(String args[]){ for (int i=0;i<10;i+=1){ if ...

  2. Xshell连接Ubuntu失败问题

    转自:https://www.linuxidc.com/Linux/2017-08/146222.htm Xshell是一个安全终端模拟软件,可以进行远程登录.我使用XShell的主要目的是在Wind ...

  3. Struts2常见配置(草稿)

    Struts2框架配置文件加载的顺序(了解加载配置文件的顺序,重点掌握struts.xml配置文件) 1.Struts2框架的核心是StrutsPrepareAndExecuteFilter过滤器,该 ...

  4. keras embeding设置初始值的两种方式

    随机初始化Embedding from keras.models import Sequential from keras.layers import Embedding import numpy a ...

  5. 大道至简的C语言内存管理

    C语言内存的开辟和释放需要程序员自己来实现. 而C语言的内存开辟和释放只在stdlib.h里面提供了四个函数,这么简洁的设计就足以完成一切工作. C++里面各种类型的指针漫天飞舞,显得啰嗦冗余. ca ...

  6. Linux安装ElasticSearch-2.2.0-分词器插件(Mmseg)

    1.在gitpub上搜索elasticsearch-analysis,能够看到所有elasticsearch的分词器: 2.安装Mmseg分词器:https://github.com/medcl/el ...

  7. log4j(五)——如何控制不同目的地的日志输出?

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 import org.apache.log4j.*; import java.io ...

  8. Spring Boot加载配置文件

    问题1:Spring如何加载配置,配置文件位置? 1.默认位置: Spring Boot默认的配置文件名称为application.properties,SpringApplication将从以下位置 ...

  9. Oracle 12C -- native left outer join的加强

    在11g中SQL> select count(*)  2    from emp a, dept b, bonus c  3   where a.deptno(+) = b.deptno  4  ...

  10. FreeSWITCH收到重复的DTMF信号

    一.背景 用户是运营商手机,拨打的是运营商的固话号码进入的FreeSWITCH的IVR,进入IVR语音播报后,按指定的分机号呼相关人员. 二.现象 用户反映拨打124870找不到指定人员,以前是正常的 ...