MariaDB + Visual Studio 2017 环境下的 ODBC 入门开发
参考:
环境:
- Windows 10 x64 1803
- MariaDB TX 10.2.14 x64
- MariaDB ODBC Connector 3.0.3 x64
- Visual Studio 2017 Community 15.6.7
安装ODBC驱动并配置数据源:
先安装ODBC驱动。根据自身需求选择32或64位版本。我选择了64位版本。
打开ODBC数据源管理程序,点击右侧的“添加”按钮,添加用户DSN。如图操作。
后面按照默认配置,点击Next即可。
编写ODBC程序:
1 引入头文件:
#include <iostream> #include <windows.h> #include <sqlext.h>
2 定义一个检查错误的宏:
#define ODBC_CHECK(x) \ {\ if (!SQL_SUCCEEDED(x))\ {\ std::cout << "SQL error occurred at line " << __LINE__ << ".";\ getchar();\ exit(-);\ }\ }
3 ODBC初始化,为ODBC分配环境句柄
(分配环境句柄:注意,这里使用了新版的ODBC API SQLAllocHandle,而不是SQLAllocEnv)
// SQL Handle of ENVironment SQLHENV env; ODBC_CHECK(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env)); // SQLAllocEnv ODBC_CHECK(SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, ));
4 建立应用程序与ODBC数据源的连接
(分配连接句柄:注意,这里使用了新版的ODBC API SQLAllocHandle,而不是SQLAllocConnect)
// SQL Handle of DB Connection SQLHDBC dbc; SQLCHAR dbcConfOut[]; ODBC_CHECK(SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc)); // SQLAllocConnect ODBC_CHECK(SQLSetConnectAttr(dbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER), ));
(连接数据源:可以使用SQLConnect,也可以使用SQLDriverConnect;可以手动指定DSN名字,也可以通过弹出窗口来指定)
// specify manually ODBC_CHECK(SQLDriverConnect(dbc, NULL, (SQLCHAR *)"DSN=MariaDB;", SQL_NTS, dbcConfOut, sizeof(dbcConfOut), NULL, SQL_DRIVER_COMPLETE)); // SQLConnect // specify by popup window //ODBC_CHECK(SQLDriverConnect(dbc, GetDesktopWindow(), NULL, SQL_NTS, // dbcConfOut, sizeof(dbcConfOut), NULL, SQL_DRIVER_COMPLETE)); // SQLConnect
(显示连接成功的信息)
std::cout << "Connected!" << std::endl << "ConnStrIn = " << dbcConfOut << std::endl; SQLCHAR dbmsName[]; ODBC_CHECK(SQLGetInfo(dbc, SQL_DBMS_NAME, (SQLPOINTER)dbmsName, sizeof(dbmsName), NULL)); SQLCHAR dbmsVer[]; ODBC_CHECK(SQLGetInfo(dbc, SQL_DBMS_VER, (SQLPOINTER)dbmsVer, sizeof(dbmsVer), NULL)); std::cout << "DBMS Name = " << dbmsName << std::endl << "DBMS Version = " << dbmsVer << std::endl;
(分配语句句柄:注意,这里使用了新版的ODBC API SQLAllocHandle,而不是SQLAllocStmt)
// SQL Handle of STateMenT SQLHSTMT stmt; ODBC_CHECK(SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt)); // SQLAllocStmt
5 利用SQLExecDirect语句,实现数据库应用程序对数据库的建立、查询、修改、删除等
(建立一个循环,一直接收并执行用户的SQL的语句,直到用户退出)
const int queryLen = ; SQLCHAR query[queryLen]; std::cout << "Please input your SQL query. Type CTRL+Z to quit." << std::endl << dbmsName << " >"; while (fgets((char*)query, queryLen - , stdin)) { if (query[] == '\n') { std::cout << dbmsName << " >"; continue; } switch (SQLExecDirect(stmt, query, SQL_NTS)) { case SQL_SUCCESS_WITH_INFO: case SQL_SUCCESS: { SQLSMALLINT col; SQLNumResultCols(stmt, &col); // SELECT if (col > ) { // 2 methods: SQLGetData() and SQLBindCol() // SQLGetData() is adopted here char buf[]; SQLUSMALLINT colidx; // print column names for (colidx = ; colidx <= col; ++colidx) { SQLColAttribute(stmt, colidx, SQL_DESC_NAME, buf, sizeof(buf), NULL, NULL); std::cout << buf << " "; } std::cout << std::endl; // iterate each row unsigned row = ; // row counter while (SQL_SUCCEEDED(SQLFetch(stmt))) { ++row; // iterate each column for (colidx = ; colidx <= col; ++colidx) { SQLLEN indicator; if (SQL_SUCCEEDED(SQLGetData(stmt, colidx, SQL_C_CHAR, buf, sizeof(buf), &indicator))) { if (indicator == SQL_NULL_DATA) strcpy(buf, "NULL"); std::cout << buf << " "; } } std::cout << std::endl; } if (row == ) { std::cout << "1 row in set." << std::endl; } else { std::cout << row << " rows in set." << std::endl; } } // CREATE, UPDATE, DELETE, etc. else { SQLLEN row; ODBC_CHECK(SQLRowCount(stmt, &row)); if (row == ) { std::cout << "1 row affected." << std::endl; } else { std::cout << row << " rows affected." << std::endl; } } break; } case SQL_ERROR: { std::cout << "Returned SQL_ERROR." << std::endl; break; } default: { std::cout << "Unknown SQLRETURN." << std::endl; } } ODBC_CHECK(SQLFreeStmt(stmt, SQL_CLOSE)); std::cout << dbmsName << " >"; }
6 检索查询结果集
7 结束数据库应用程序
// release resources ODBC_CHECK(SQLFreeHandle(SQL_HANDLE_STMT, stmt)); ODBC_CHECK(SQLDisconnect(dbc)); ODBC_CHECK(SQLFreeHandle(SQL_HANDLE_DBC, dbc)); ODBC_CHECK(SQLFreeHandle(SQL_HANDLE_ENV, env)); return ;
MariaDB + Visual Studio 2017 环境下的 ODBC 入门开发的更多相关文章
- (转)在SQL Server 2016,Visual Studio 2017环境下,连接数据库屡屡失败,在connectionString上出的问题
适用情景: 1,ServerVersion出了问题,“SqlCnt.ServerVersion”引发了类型“System.InvalidOperationException”的异常 2,在String ...
- 从头开始学eShopOnContainers——Visual Studio 2017环境配置
一.安装和配置Docker环境 1.安装Docker CE for Windows 从官方网站下载并安装,https://docs.docker.com/docker-for-windows/inst ...
- Visual Studio 2013环境下操作vc6/vc7/vc8等低版本平台项目【编译|生成|调试】
现代化的开发环境,微软一直在推出更新换代,我们所处的技术环境在日新月异的变化:不过在中国多数人们一边疲惫的追赶着时代的步伐,一边坚守着自己所获悉所掌握的那些紧吧吧的知本.对技术工具的掌握并非他们所想要 ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)
主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)
(1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...
- Visual Studio IDE环境下利用模板创建和手动配置CUDA项目教程
目前版本的cuda是很方便的,它的一个安装里面包括了Toolkit`SDK`document`Nsight等等,而不用你自己去挨个安装,这样也避免了版本的不同步问题. 1 cuda5.5的下载地址,官 ...
- Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ
因为需要用 C++ 实现联机对战的功能,但是不想直接用 winsock ,因此选了ZMQ 框架(不知道合不合适).安装的过程还是挺艰辛的.但是也学到了些东西,记录一下.另外,Zmq 的作者 Piete ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(1)
参考如下文档: 传送门:http://www.stm32cube.com/article/128 如果链接不存在的话,下载我截屏好的图: 传送门:https://pan.baidu.com/s/1NC ...
- win10 visual studio 2017环境中安装CUDA8
从https://developer.nvidia.com/cuda-toolkit-archive下载CUDA 8 安装 从https://developer.nvidia.com/gamework ...
随机推荐
- Redis数据库No-SQL的介绍安装和使用
Redis安装步骤 1.官网下载Redis压缩包http://download.redis.io/releases/redis-5.0.2.tar.gz,然后将下载的redis上传到虚拟机的/usr/ ...
- iOS中创建自定义的圆角按钮
iOS中很多时候都需要用到指定风格的圆角按钮,尽管UIButton提供了一个方式创建圆角按钮: + (id)buttonWithType:(UIButtonType)buttonType;//指定bu ...
- 【自用】OI计划安排表一轮
网络流√ 上下界最大流√ 线性规划转费用流√ RMQ优化建图√ 单纯形√ 字符串相关 hash√ 扩展KMP 回文自己主动机 数据结构 平衡树 启示式合并 替罪羊树 LCT 树套树 KD-Tree 二 ...
- gulp配置 - PC
初始化目录结构如下(图片看不清可以拖到桌面或者直接CTRL+鼠标滚轮进行观看) 开发环境示例: 上线环境示例: gulpfile.js(详解版) (2018-3-28)添加了scss处理(去除了les ...
- Multi-company rules
Object Name Domain 说明 Point of Sale Point Of Sale Order [('company_id', '=', user.company_id.id)] 指派 ...
- 性能測试JMeter趟的坑之JMeter的bug:TPS周期性波动问题
先说下问题: 我在做性能測试时,使用JMeter搞了100个并发,以100TPS的压力压測十分钟,但压力一直出现波动.并且出现波动时JMeter十分卡,例如以下图: 周期性TPS波动 各种猜測: 所以 ...
- java开始到熟悉100-102
本次内容:arraylist() 1. package list; import java.util.ArrayList; import java.util.Date; import java.uti ...
- 这个捕鱼游戏制作的真心不错,原创音乐,AV动作,让人流连忘返啊呵呵
女生看完这篇文章后果断地命令男朋友打开电脑和手机 2014-10-10 茶娱饭后 本人纯屌丝宅男一名.专注游戏十年有余,玩过无数大大小小的游戏,对捕鱼游戏情有独钟.我不想说在捕鱼游戏方面有多专业 ...
- Linux安装程序Anaconda分析(续)
本来想写篇关于Anaconda的文章,但看到这里写的这么详细,转,原文在这里:Linux安装程序Anaconda分析(续) (1) disptach.py: 下面我们看一下Dispatcher类的主要 ...
- TopSelf安装Windows服务提示:执行未经授权的操作。。
在一个项目中用到了八九个服务,服务的执行时间也是五花八门,有的年末执行一次,有的月中执行一次,有的月末最后一天执行一次,有的月初连续执行5天, 有的每天晚上执行,...还好各个服务并没有严格的关联关系 ...