参考:

Easysoft公司提供的ODBC教程

微软提供的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 入门开发的更多相关文章

  1. (转)在SQL Server 2016,Visual Studio 2017环境下,连接数据库屡屡失败,在connectionString上出的问题

    适用情景: 1,ServerVersion出了问题,“SqlCnt.ServerVersion”引发了类型“System.InvalidOperationException”的异常 2,在String ...

  2. 从头开始学eShopOnContainers——Visual Studio 2017环境配置

    一.安装和配置Docker环境 1.安装Docker CE for Windows 从官方网站下载并安装,https://docs.docker.com/docker-for-windows/inst ...

  3. Visual Studio 2013环境下操作vc6/vc7/vc8等低版本平台项目【编译|生成|调试】

    现代化的开发环境,微软一直在推出更新换代,我们所处的技术环境在日新月异的变化:不过在中国多数人们一边疲惫的追赶着时代的步伐,一边坚守着自己所获悉所掌握的那些紧吧吧的知本.对技术工具的掌握并非他们所想要 ...

  4. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)

    主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...

  5. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)

    (1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...

  6. Visual Studio IDE环境下利用模板创建和手动配置CUDA项目教程

    目前版本的cuda是很方便的,它的一个安装里面包括了Toolkit`SDK`document`Nsight等等,而不用你自己去挨个安装,这样也避免了版本的不同步问题. 1 cuda5.5的下载地址,官 ...

  7. Windows10 + Visual Studio 2017环境为C++工程安装使用ZMQ

    因为需要用 C++ 实现联机对战的功能,但是不想直接用 winsock ,因此选了ZMQ 框架(不知道合不合适).安装的过程还是挺艰辛的.但是也学到了些东西,记录一下.另外,Zmq 的作者 Piete ...

  8. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(1)

    参考如下文档: 传送门:http://www.stm32cube.com/article/128 如果链接不存在的话,下载我截屏好的图: 传送门:https://pan.baidu.com/s/1NC ...

  9. win10 visual studio 2017环境中安装CUDA8

    从https://developer.nvidia.com/cuda-toolkit-archive下载CUDA 8 安装 从https://developer.nvidia.com/gamework ...

随机推荐

  1. Log4J使用详情

    一 .Log4J使用详情 Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以 ...

  2. kafka exactly-once

    2018年,Apache Kafka以一种特殊的设计和方法实现了强语义的exactly-once和事务性. 这篇文章将讲解kafka中exactly-once和事务操作的原理,具体为 (1)exact ...

  3. CentOS下常用的 19 条命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

  4. Android自己定义圆角ImageView

    我们常常看到一些app中能够显示圆角图片.比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源.我们也能够自己通过程序实现的,以下介绍一个自己定义圆角Imag ...

  5. 关于使用openfiler作为共享存储来安装rac时的问题

    关于使用openfiler作为共享存储来安装rac时的问题 第一:一定要使用openfiler-2.3-x86-disc1.iso这个版本号的openfiler,不要使用其它版本号的openfiler ...

  6. 读写锁(pthread)

    读写锁: 用于对于某个给定资源的共享访问,而不是像互斥锁那样,将所有试图进入临界区的线程都阻塞住 相关内容: 线程互斥锁 分配规则:(写独占,读共享) 1.只要没有线程持有某个给定的读写锁用于写,那么 ...

  7. angularjs中常见错误

    使用angularjs时间不是非常长,理解不够透彻.但为刚開始学习的人还是能够帮助点的. 1.回调函数. . ...-->切记它是异步的,出现莫名其妙的问题记得查看一下 2.内存泄露. .... ...

  8. SQL 通配符及其使用

    Sql Server中通配符的使用 通配符_ "_"号表示任意单个字符,该符号只能匹配一个字符."_"可以放在查询条件的任意位置,且只能代表一个字符.一个汉字只 ...

  9. WebGIS中地图恢复初始位置及状态

    我想实现这么一个效果:地图任意缩放后,点击一个按钮,将立刻回到地图初始加载时的位置,并且是没有缩放的状态. 怎么办呢?最好的办法就是用Home按钮. <!DOCTYPE HTML> < ...

  10. java的gradle项目的基本配置

    plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring ...