看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂。写这篇文章的目的不是别的,就一个,告诉您用MySQL的C API直接操作MySQL数据,并做了比较高效的封装,可以帮助开发人员大幅度提高采用MySQL的C API操作MySQL数据库的效率。
直接进入主题:
 
准备工作我就不介绍了,请参考上一篇博客:http://www.cnblogs.com/mlgjb/p/8798361.html
 
在工程建立添加以下两个文件:
第一个文件头文件:VspdCTOMySQL.h
  1. /****************************MYSQL IN C*******************************/
  2. /*************************2007 -03 -07 *******************************/
  3. /*************************李克喜**************************************/
  4. #include <stdio.h>
  5. #include <string>
  6. #include <afxsock.h>
  7. #include "mysql.h"
  8. using namespace std;
  9. class VspdCToMySQL
  10. {
  11. public:
  12. //变量
  13. MYSQL mysql;
  14. /*
  15. 构造函数和稀构函数
  16. */
  17. VspdCToMySQL();
  18. ~VspdCToMySQL();
  19. /*
  20. 主要的功能:
  21. 初始化数据库
  22. 连接数据库
  23. 设置字符集
  24. 入口参数:
  25. host :MYSQL服务器IP
  26. port:数据库端口
  27. Db:数据库名称
  28. user:数据库用户
  29. passwd:数据库用户的密码
  30. charset:希望使用的字符集
  31. Msg:返回的消息,包括错误消息
  32. 出口参数:
  33. int :0表示成功;1表示失败
  34. */
  35. int ConnMySQL(char *host,char * port,char * Db,char * user,char* passwd,char * charset,char * Msg);
  36. /*
  37. 主要的功能:
  38. 查询数据
  39. 入口参数:
  40. SQL:查询的SQL语句
  41. Cnum:查询的列数
  42. Msg:返回的消息,包括错误消息
  43. 出口参数:
  44. string 准备放置返回的数据,多条记录则用0x06隔开,多个栏位用0x05隔开
  45. 如果 返回的长度= 0,责表示舞结果
  46. */
  47. string SelectData(char * SQL,int Cnum ,char * Msg);
  48. /*
  49. 主要功能:
  50. 插入数据
  51. 入口参数
  52. SQL:查询的SQL语句
  53. Msg:返回的消息,包括错误消息
  54. 出口参数:
  55. int :0表示成功;1表示失败
  56. */
  57. int InsertData(char * SQL,char * Msg);
  58. /*
  59. 主要功能:
  60. 修改数据
  61. 入口参数
  62. SQL:查询的SQL语句
  63. Msg:返回的消息,包括错误消息
  64. 出口参数:
  65. int :0表示成功;1表示失败
  66. */
  67. int UpdateData(char * SQL,char * Msg);
  68. /*
  69. 主要功能:
  70. 删除数据
  71. 入口参数
  72. SQL:查询的SQL语句
  73. Msg:返回的消息,包括错误消息
  74. 出口参数:
  75. int :0表示成功;1表示失败
  76. */
  77. int DeleteData(char * SQL,char * Msg);
  78. /*
  79. 主要功能:
  80. 关闭数据库连接
  81. */
  82. void CloseMySQLConn();
  83. };

 

 
 
第二个文件实现文件:VspdCTOMySQL.cpp
  1. /****************************MYSQL IN C*******************************/
  2. /*************************2007 -03 -07 *******************************/
  3. /*************************李克喜**************************************/
  4. #include "stdafx.h"
  5. #include "VspdCTOMySQL.h"
  6. VspdCToMySQL::VspdCToMySQL()
  7. {
  8. }
  9. VspdCToMySQL::~VspdCToMySQL()
  10. {
  11. }
  12. //初始化数据
  13. int VspdCToMySQL::ConnMySQL(char *host,char * port ,char * Db,char * user,char* passwd,char * charset,char * Msg)
  14. {
  15. if( mysql_init(&mysql) == NULL )
  16. {
  17. Msg = "inital mysql handle error";
  18. return 1;
  19. }
  20. if (mysql_real_connect(&mysql,host,user,passwd,Db,0,NULL,0) == NULL)
  21. {
  22. Msg = "Failed to connect to database: Error";
  23. return 1;
  24. }
  25. if(mysql_set_character_set(&mysql,"GBK") != 0)
  26. {
  27. Msg = "mysql_set_character_set Error";
  28. return 1;
  29. }
  30. return 0;
  31. }
  32. //查询数据
  33. string VspdCToMySQL::SelectData(char * SQL,int Cnum,char * Msg)
  34. {
  35. MYSQL_ROW m_row;
  36. MYSQL_RES *m_res;
  37. char sql[2048];
  38. sprintf(sql,SQL);
  39. int rnum = 0;
  40. char rg = 0x06;//行隔开
  41. char cg = {0x05};//字段隔开
  42. if(mysql_query(&mysql,sql) != 0)
  43. {
  44. Msg = "select ps_info Error";
  45. return "";
  46. }
  47. m_res = mysql_store_result(&mysql);
  48. if(m_res==NULL)
  49. {
  50. Msg = "select username Error";
  51. return "";
  52. }
  53. string str("");
  54. while(m_row = mysql_fetch_row(m_res))
  55. {
  56. for(int i = 0;i < Cnum;i++)
  57. {
  58. str += m_row[i];
  59. str += rg;
  60. }
  61. str += rg;
  62. rnum++;
  63. }
  64. mysql_free_result(m_res);
  65. return str;
  66. }

 

 
 
//插入数据
  1. int VspdCToMySQL::InsertData(char * SQL,char * Msg)
  2. {
  3. char sql[2048];
  4. sprintf(sql,SQL);
  5. if(mysql_query(&mysql,sql) != 0)
  6. {
  7. Msg = "Insert Data Error";
  8. return 1;
  9. }
  10. return 0;
  11. }

 

 
//更新数据
  1. int VspdCToMySQL::UpdateData(char * SQL,char * Msg)
  2. {
  3. char sql[2048];
  4. sprintf(sql,SQL);
  5. if(mysql_query(&mysql,sql) != 0)
  6. {
  7. Msg = "Update Data Error";
  8. return 1;
  9. }
  10. return 0;
  11. }

 

//删除数据
  1. int VspdCToMySQL::DeleteData(char * SQL,char * Msg)
  2. {
  3. char sql[2048];
  4. sprintf(sql,SQL);
  5. if(mysql_query(&mysql,sql) != 0)
  6. {
  7. Msg = "Delete Data error";
  8. return 1;
  9. }
  10. return 0;
  11. }

 

//关闭数据库连接
  1. void VspdCToMySQL::CloseMySQLConn()
  2. {
  3. mysql_close(&mysql);
  4. }

 

 
 
在main函数,(如果是其他工程级不是main了,可能是一个按钮里面的代码块)添加      一些代码,添加之后如下
  1. #include "stdafx.h"
  2. #include "VspdCTOMySQL.h"
  3. int main(int argc, char* argv[])
  4. {
  5. char* host="MYSQL服务器IP";
  6. char* user="root";
  7. char* port ="3306";
  8. char* passwd="用户密码";
  9. char* dbname="数据库名称";
  10. char* charset = "GBK";//支持中文
  11. char* Msg = "";//消息变量
  12. //初始化
  13. VspdCToMySQL * vspdctomysql = new VspdCToMySQL;
  14. if(vspdctomysql->ConnMySQL(host,port,dbname,user,passwd,charset,Msg) == 0)
  15. printf("连接成功/r/n");
  16. else
  17. printf(Msg);
  18. //查询
  19. char * SQL = "SELECT ids,username,passwd,address FROM vcaccesstest";
  20. string str = vspdctomysql->SelectData(SQL,4,Msg);
  21. if( str.length() > 0 )
  22. {
  23. printf("查询成功/r/n");
  24. printf(str.data());
  25. printf("/r/n");
  26. }
  27. else
  28. {
  29. printf(Msg);
  30. }
  31. //插入
  32. SQL = "insert into vcaccesstest(ids,username,passwd,address) values(4,\'我的\',\'123210\',\'测试地址\')";
  33. if(vspdctomysql->InsertData(SQL,Msg) == 0)
  34. printf("插入成功/r/n");
  35. //更新
  36. SQL = "update vcaccesstest set username = \'修改了\',passwd=\'2345\' where ids = 3 ";
  37. if(vspdctomysql->UpdateData(SQL,Msg) == 0)
  38. printf("更新成功/r/n");
  39. //删除
  40. SQL = "delete from vcaccesstest where ids = 3 ";
  41. if(vspdctomysql->DeleteData(SQL,Msg) == 0)
  42. printf("删除成功/r/n");
  43. vspdctomysql->CloseMySQLConn();
  44. return 0;
  45. }

 

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

版权声明:本文为mlgjb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mlgjb/p/8810314.html