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 ...
随机推荐
- htmlcxx取指定字段实例
#include <string> #include <iostream> #include <sstream> #include <htmlcxx/html ...
- 74.Search in a 2D Matrix
/* * 74.Search in a 2D Matrix * 12.5 by Mingyang * 这里面的对应挺巧的: * 这个就是将2D矩阵转化成1行数组的对应表.所以对于二分查找法的初始值为: ...
- 基于MNIST数据的softmax regression
跟着tensorflow上mnist基本机器学习教程联系 首先了解sklearn接口: sklearn.linear_model.LogisticRegression In the multiclas ...
- C++学习总结 复习篇2
延续上一小节内容:下面继续讲解虚函数和多态 虚函数和多态 基类指针可以指向任何派生类的对象,但是不能调用派生类对象的成员. 但是,基类可以调用覆盖了虚函数的函数.(现在调用将来,这有问题,说明现在 ...
- C#3.0之神奇的Lambda表达式和Lambda语句
“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型.所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to” ...
- 汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码
OpenSSL 心血(HeartBleed)漏洞 是openssl 在 2014-04-07 发布的重大安全漏洞(CVE-2014-0160)这个漏洞使攻击者可以从server内存中读取64 KB的数 ...
- MTK 手机芯片 2014 Roadmap
注:其中 A53 架构的是 64 位处理器. MT6733 魅蓝 MT6752 魅族 note 联通/移动版 MT6595 魅族 MX4
- ln: 正在创建指向“asm-arm”的符号链接“asm”: 不支持的操作
原因是不能在windows共享目录编译,将待编译的uboot源码copy到home目录
- Git 和 SVN 之间的五个基本区别
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征.所以,这篇文章的主要目的就是 ...
- php composer 相关及版本约束等小技巧
对于现代语言而言,包管理器基本上是标配.Java有Maven,Python有pip,Ruby有gem,Nodejs有npm.PHP的则是PEAR,不过PEAR坑不少: 依赖处理容易出问题 配置非常复杂 ...