C++通过ODBC和通过MFC ODBC操作mysql的两种方式

使用vs2013和64位的msql 5.6.16进行操作

项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍

既然使用到了ODBC那么就要需要添加数据源了

控制面板->管理工具->数据源->用户DSN->添加

填写相关的数据库连接配置和使用的数据库,可点击Test进行测试,查看是否成功连接,设置完成后点击OK

其中Data Source Name即MySqlODBC我们会在连接数据库时用到

至此,数据源添加完毕

一、通过ODBC进行操作

开放数据库互连(Open Database Connectivity,ODBC)是微软提供的一组用于数据库访问的规范接口,多数数据库都提供了ODBC驱动

1、新建一个空项目

2、如果使用的mysql是64位的,需要将项目的解决方案平台由win32改成x64

至此,相关配置全部完成

程序代码

main.cpp

  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <sql.h>
  5. #include <odbcss.h>
  6. #include <sqlext.h>
  7. #define MAXBUFLEN 255
  8. #define MaxNameLen 20
  9.  
  10. #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
  11.  
  12. SQLHENV henv = SQL_NULL_HENV;//定义环境句柄
  13. SQLHDBC hdbc1 = SQL_NULL_HDBC;//定义数据库连接句柄
  14. SQLHSTMT hstmt1 = SQL_NULL_HSTMT;//定义语句句柄
  15.  
  16. using namespace std;
  17. int main()
  18. {
  19. RETCODE retcode;//错误返回码
  20. retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
  21. if (retcode < )//错误处理
  22. {
  23. cout << "allocate ODBC Environment handle errors." << endl;
  24. return -;
  25. }
  26. retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
  27. (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
  28. if (retcode < ) //错误处理
  29. {
  30. cout << "the ODBC is not version3.0 " << endl;
  31. return -;
  32. }
  33. retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
  34. if (retcode < ) //错误处理
  35. {
  36. cout << "allocate ODBC connection handle errors." << endl;
  37. return -;
  38. }
  39.  
  40. char* szDSN = "MySqlODBC";//添加数据源时,为其起的名字
  41. char* szUID = "root";
  42. char* szAuthStr = "";
  43.  
  44. retcode = SQLConnect(hdbc1,
  45. (SQLCHAR*)szDSN,
  46. (SWORD)strlen(szDSN),
  47. (SQLCHAR*)szUID,
  48. (SWORD)strlen(szUID),
  49. (SQLCHAR*)
  50. szAuthStr,
  51. (SWORD)strlen(szAuthStr));
  52.  
  53. if (retcode < ) //错误处理
  54. {
  55. cout << "connect to ODBC datasource errors." << endl;
  56. return -;
  57. }
  58.  
  59. retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
  60. if (retcode < )
  61. {
  62. cout << "allocate ODBC statement handle errors." << endl;
  63. return -;
  64. }
  65. retcode = SQLExecDirect(hstmt1, (SQLCHAR*)"SElECT * FROM book", SQL_NTS);
  66. if (retcode < )
  67. {
  68. cout << "Executing statement throught ODBC errors." << endl;
  69. return -;
  70. }
  71. SQLCHAR bookname[MaxNameLen + ];
  72. SQLCHAR size[MaxNameLen + ];
  73. SQLLEN columnLen = ;
  74.  
  75. retcode = SQLBindCol(hstmt1, , SQL_C_CHAR, bookname, MaxNameLen, &columnLen);
  76. retcode = SQLBindCol(hstmt1, , SQL_C_CHAR, size, MaxNameLen, &columnLen);
  77. while ((retcode = SQLFetch(hstmt1)) != SQL_NO_DATA)
  78. {
  79. cout <<setw() <<"BookName:" << bookname << endl;
  80. cout << setw() << "Size:" << size << endl;
  81. }
  82. system("pause");
  83. }

运行结果

一、通过MFC ODBC进行操作

MFC提供了对ODBC进行了封装,使得利用MFC创建ODBC的应用程序变得简单

1、新建一个win32的控制台应用程序

2、进行以下修改

MFC的使用:在共享DLL中使用MFC

字符集:使用Unicode字符集

3、如果使用的mysql是64位的,需要将项目的解决方案平台由win32改成x64

至此,相关配置全部完成

程序代码

main.cpp

  1. #include "stdafx.h"
  2. #include "afxdb.h"
  3. #include <iostream>
  4. #include <iomanip>
  5. using namespace std;
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8. CDatabase db;
  9.  
  10. if (!db.IsOpen())//判断数据库是否已经被打开
  11. {
  12.  
  13. BOOL bflag= db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=MySqlODBC;UID=root;PWD=123456"));
  14. if (!bflag)
  15. {
  16. cout << "ERROR" << endl;
  17. }
  18. }
  19.  
  20. CRecordset rs(&db);
  21. CString str;
  22. str.Format(L"select * from book");
  23. try
  24. {
  25. rs.Open(CRecordset::forwardOnly, (L"%s", str));
  26. short nFields = rs.GetODBCFieldCount();
  27. while (!rs.IsEOF())
  28. {
  29.  
  30. CDBVariant varValue;
  31. rs.GetFieldValue(L"bookname", varValue);
  32. cout << setw() << "BookName:" << *varValue.m_pstringA << endl;
  33. rs.GetFieldValue(L"size", varValue);
  34. cout << setw() << "Size:" << *varValue.m_pstringA << endl;
  35. rs.MoveNext();
  36. }
  37. }
  38. catch (...)
  39. {
  40. cout << "ERRPR" << endl;
  41. }
  42.  
  43. db.Close();
  44. system("pause");
  45. }

运行结果

C++操作mysql方法总结(2)的更多相关文章

  1. C++操作mysql方法总结(3)

    C++通过mysql++操作mysql的方式   使用vs2013和64位的msql 5.6.16进行操作 项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍   Mysql ...

  2. 转:C++操作mysql方法总结(1)

    原文:http://www.cnblogs.com/joeblackzqq/p/4332945.html C++通过mysql的c api和通过mysql的Connector C++ 1.1.3操作m ...

  3. C++操作mysql方法总结(1)

    C++通过mysql的c api和通过mysql的Connector C++ 1.1.3操作mysql的两种方式 使用vs2013和64位的msql 5.6.16进行操作 项目中使用的数据库名为boo ...

  4. [mysql] C++操作mysql方法总结(1)

    From: http://www.cnblogs.com/magicsoar/p/3817518.html C++通过mysql的c api和通过mysql的Connector C++ 1.1.3操作 ...

  5. [mysql] C++操作mysql方法

    下载:http://mirrors.sohu.com/mysql/MySQL-5.5/ From: http://www.cnblogs.com/magicsoar/p/3817518.html C+ ...

  6. python操作mysql方法和常见问题

    http://www.cnblogs.com/ma6174/archive/2013/02/21/2920126.html 安装mysql模块 sudo easy_install mysql-pyth ...

  7. Shell脚本中执行sql语句操作mysql的5种方法【转】

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  8. nodejs mysql 操作数据库方法二

    node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选, ...

  9. python操作mysql代码讲解(及其实用,未来测试工作主要操作数据库的方法)

    pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 1 pip3 install pymysql 使用操作 1.执行SQL 1 2 3 4 ...

随机推荐

  1. logistic softmax

    sigmoid函数(也叫逻辑斯谛函数):  引用wiki百科的定义: A logistic function or logistic curve is a common “S” shape (sigm ...

  2. ubuntu 装 mysql

    sudo apt-get install mysql-server mysql-client

  3. 2016年JD工作遇到的问题:6-15,日常小问题

    6.eclipse通过类名,找到所在的jar包. 解决办法:选中class, 快捷键 Ctrl +Shift+ T!!然后-- 之前经常是,根据类名找到对应的源文件,大脑短路,忘了下面的jar包提示. ...

  4. EnterpriseDb公司的Postgres Enterprise Manager 安装图解

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackg ...

  5. 01- web应用与https协议

    1. import socket server = socket.socket() server.bind(("127.0.0.1", 8800)) server.listen(5 ...

  6. Jenkins +svn +maven +tomcat+ ansible 自动化批量部署

    Jenkins +svn +maven +tomcat+ ansible 自动化批量部署 一.部署svn yum install subversion 先创建目录 mkdir /home/svn 创建 ...

  7. eclipse生成ant build.xml打war包

      背景: 最近想实现jenkins+ant命令一键打war包,部署到测试环境,然后自动化接口测试,结果发现用eclipse本身导出的ant buildfiles文件,打包出来都是空文件.很多代码都没 ...

  8. JUC——线程同步锁(ReentrantReadWriteLock读写锁)

    读写锁简介 所谓的读写锁值得是两把锁,在进行数据写入的时候有一个把“写锁”,而在进行数据读取的时候有一把“读锁”. 写锁会实现线程安全同步处理操作,而读锁可以被多个对象读取获取. 读写锁:ReadWr ...

  9. while循环计算规则:内循环—外循环!

    num= 1 #值 =1while num <= 10 : # num(1)小于10 print(num) # 应该打印 这个1的值 num +=1 # num+=1等价于 num再加1 所以这 ...

  10. 04-matplotlib-柱形图

    import numpy as np import matplotlib.pyplot as plt # 柱形图 # 例一 N =5 y = [15,28,10,30,25] index = np.a ...