看过很多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 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); }
在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; }
数据库表确认表存在,(程序中的表和字段是我的数据库里面的内容,你要自己搞定你的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