ODBC 安装/使用/编程
前言:
主要讲解ODBC API, 以mysql为例, 从配置到安装, 再到具体的编程, 以期对ODBC有个初步的认识.
*) 下载mysql, 选择社区版mysql, 并安装
http://dev.mysql.com/downloads/mysql/
*) 下载mysql-odbc driver驱动, 记得要下载32版本
http://dev.mysql.com/downloads/connector/odbc/
*) 使用odbc数据源管理器, 推荐odbcad32.exe
http://support.microsoft.com/kb/942976/zh-cn
*) 驱动在注册表
在注册表目录项HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI下, 就能看到Mysql ODBC 驱动具体细节了. 目录项ODBC Drivers保存着系统中已安装的所有ODBC驱动信息.目录项Mysql ODBC 5.3 Unicode Driver则保存着具体的mysql驱动信息.
键Driver和键Setup的区别在哪? Driver对应的dll, 是具体实现的ODBC Driver, 而Setup对应的dll, 只是应用于系统的ODBC驱动管理器(odbc.exe, odbcad32.exe), 用于配置DNS数据源. 而对于32位的驱动, 其对应的注册表目录项在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI下, 这也是个差异点.
*) 在用户/系统DSN中, 添加DSN, 选择mysql-odbc, 如图所示:
编辑DSN如图所示:
在windows注册表目录项HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI下, 为具体的创建的DSN.
数据源mysql_test为之前创建, 具体记录了详细的配置信息, 其中Driver具体对应 C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc5w.dll, database对应数据库test. 每个数据源其具体项各有区别. ODBC Data sources目录项, 记录了其他所有的数据源项, 方便告知驱动程序管理器具体odbc驱动器的数据源类型.
用户DSN和系统DSN之间的区别, 用户DSN只对当前用户有效, 其所在的注册表的位置信息一般在HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI目录项下, 而系统DSN对所有用户都有效, 在HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI目录项下.
*) 在数据库test下, 创建
*)odbc-api例子
http://wenku.baidu.com/link?url=Reerd4fWwMOoSLW1gmCQgluaMFEMUBq1Wq-o6e3Iu13UbZaaqKYpwNPnX0Ik_rXEBvhTNg380GhMZBJxfv65K0f3410SlF-5wWd3LLuwTE7
http://wenku.baidu.com/view/7cefbf1ec5da50e2524d7fbc.html
编译器出现如下错误时:
出现错误error C2146: syntax error : missing ';' before identifier 'SQLHWND'
需要在包含sql.h, sqlext.h头文件之前包含windows.h
参考如下解决方案: http://bbs.csdn.net/topics/60260260
出现错误: cannot convert parameter 2 from 'SQLCHAR *' to 'SQLWCHAR *'
参考如下解决方案: http://blog.sina.com.cn/s/blog_6d2a0a1a01019k9r.html
/*
*
* for example:
* odbc example
*
*
* 本例子的目的: 通过odbc编程, 来对odbc的接口有个感性而深入的认识
*
*
*/ #include <stdio.h> #include <assert.h> #include <windows.h>
#include <sql.h>
#include <sqlext.h> int main()
{ HENV henv; // *) 申请环境句柄
SQLRETURN rcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
assert(!(rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO)); // *) 设置ODBC版本的环境属性
rcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
assert(!(rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO)); // *) 分配连接句柄
SQLHDBC hdbc;
rcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
assert(!(rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO)); // *) 连接数据源
rcode = SQLConnect(hdbc, (SQLCHAR *)"mysql_test", SQL_NTS,
(SQLCHAR *)"root", SQL_NTS, (SQLCHAR *)"123456", SQL_NTS);
assert(!(rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO)); // *) 创建SQL语句句柄
SQLHSTMT stmt;
rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc,&stmt);
assert(!(rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO)); // *) 执行具体的sql
rcode = SQLExecDirect(stmt, (SQLCHAR*)"select * from tb_student", SQL_NTS);
assert(!(rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO)); // *) 绑定和获取具体的数据项
SQLINTEGER res = SQL_NTS;
SQLCHAR name[128];
SQLINTEGER age;
SQLBindCol(stmt, 2, SQL_C_CHAR, name, sizeof(name), &res);
SQLBindCol(stmt, 3, SQL_C_SLONG, &age, sizeof(age), &res); while ((rcode=SQLFetch(stmt))!=SQL_NO_DATA_FOUND) {
if( rcode == SQL_ERROR) {
printf("sql error!\n");
} else {
printf("name:%s, age:%ld\n",name, age);
}
} // *) 清理工作, 释放具体的资源句柄
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
C语言数据类型名称 |
ODBC 数据类型定义 |
C语言实际类型 |
SQL_C_CHAR |
SQLCHAR * |
unsigned char * |
SQL_C_SSHORT[j] |
SQLSMALLINT |
short int |
SQL_C_USHORT[j] |
SQLUSMALLINT |
unsigned short int |
SQL_C_SLONG[j] |
SQLINTEGER |
long int |
SQL_C_ULONG[j] |
SQLUINTEGER |
unsigned long int |
SQL_C_FLOAT |
SQLREAL |
float |
SQL_C_DOUBLE |
SQLDOUBLE, SQLFLOAT |
double |
SQL_C_BIT |
SQLCHAR |
unsigned char |
SQL_C_STINYINT[j] |
SQLSCHAR |
signed char |
SQL_C_UTINYINT[j] |
SQLCHAR |
unsigned char |
SQL_C_SBIGINT |
SQLBIGINT |
_int64[h] |
SQL_C_UBIGINT |
SQLUBIGINT |
unsigned _int64[h] |
SQL_C_BINARY |
SQLCHAR * |
unsigned char * |
SQL_C_BOOKMARK[i] |
BOOKMARK |
unsigned long int[d] |
SQL_C_VARBOOKMARK |
SQLCHAR * |
unsigned char * |
SQL_C_TYPE_DATE[c] |
SQL_DATE_STRUCT |
struct tagDATE_STRUCT { |
SQL_C_TYPE_TIME[c] |
SQL_TIME_STRUCT |
struct tagTIME_STRUCT { |
SQL_C_TYPE_TIMESTAMP[c] |
SQL_TIMESTAMP_STRUCT |
struct tagTIMESTAMP_STRUCT { |
SQL_C_NUMERIC |
SQL_NUMERIC_STRUCT |
struct tagSQL_NUMERIC_STRUCT { |
SQL_C_GUID |
SQLGUID |
struct tagSQLGUID {
|
ODBC 安装/使用/编程的更多相关文章
- 【Linux】ODBC安装
ODBC介绍 ODBC是Open Database Connect 即开发数据库互连的简称,它是一个用于访问数据库的统一界面标准.ODBC引入一个公共接口以解决不同数据库潜在的不一致性,从而很好的保证 ...
- MySQL - ODBC安装错误问题!
MySQL的ODBC安装时候可能会出错,主要原因是缺少VC支持库,需要2010版本的VC支持库!!X86和X64分别对应MySQL对应的ODBC,不能安装一个两个都搞定,如果需要安装两个ODBC驱动, ...
- MySQL的ODBC安装错误问题!
MySQL的ODBC安装时候可能会出错,主要原因是缺少VC支持库,需要2010版本的VC支持库!!X86和X64分别对应MySQL对应的ODBC,不能安装一个两个都搞定,如果需要安装两个ODBC驱动, ...
- Hive(二):windows hive ODBC 安装
针对Windows 32位和64位的系统对应有多个版本的 Hive ODBC Connector, 在安装的过程中,版本必须完全匹配(即:32位的 connector 只能在32位的系统运行,64位的 ...
- 安装AB编程软件提示安装失败时如何处理
前言:在安装Studio 5000.FT VIEW.Logxi Emulate等AB编程软件,有时会出现安装失败.在这里,根据自己在安装过程中出现的错误情形,介绍如何处理的方法. 方法步骤 1.在安装 ...
- MySQLConnector/ODBC 安装时遇到的小问题
今天在新做的 Win2008R2 上想使用 SqlDbx 管理 MySQL,提示需要安装 MySQLConnector/ODBC,这没什么,以前装过的,按要求下载安装一个就是了. 结果在安装 MySQ ...
- Windows10 Oracle ODBC安装配置
项目紧迫,需在短时间内交付成果,新团队成员,吐嘈之前数据库设计太low,很难看懂数据库表结构间的关系,为了使新同事更好的了解数据库表结构,特意使用powerDesigner对oracle.mysql数 ...
- [零基础学pythyon]安装python编程环境
不论什么高级语言都是须要一个自己的编程环境的,这就好比写字一样,须要有纸和笔,在计算机上写东西.也须要有文字处理软件,比方各种名称的OFFICE.笔和纸以及office软件,就是写东西的硬件或软件.总 ...
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. OpenCL安装 安装我不打算 ...
随机推荐
- ubuntu14.04(server amd64)免密码sudo
vi /etc/sudoers.d/nopasswd4sudo 加入以下内容 用户名 ALL=(ALL) NOPASSWD : ALL
- 怎么彻底删除2345的各种顽固Process
清晨打开电脑,都是2345的不良新闻,心情不美美哒 2345如何卸载? “C:\Windows\System32\drivers”目录删除Mslmedia.sys 开始-运行-cmd输入“sc del ...
- Cocos2dx 3.x 屏幕适配
Cocos2dx 3.10+Cocos Studio3.10 1.在适配过程中必须明确几个概念: ①Frame大小:这个值在windows/mac/linux下就是创建窗体的大小,在手机上就是屏幕大小 ...
- C#中使用Log4记录日志
具体步骤如下: 从网上下载log4net对应.net版本的dll 在C#项目中引用该dll 创建log4net对应的配置文件 在程序中使用 log4net的配置文件如下: <?xml versi ...
- spring boot 2.0+ 错误页面配置
如果访问了错误的路径,或者后台报错 如果没有一个统一的页面! 或者说页面上展示一堆报错信息,既影响美观,又对用户不友好! 那么如何配置? 定义 ErrorPageConfig,配置错误状态与对应访问路 ...
- (GoRails )使用Vue.js制作拖拉list功能(v5-8)
视频5 改进视觉效果,让list看起来更舒服.新增横向滚动功能. 参考我的trello:https://trello.com/b/BYvCBpyZ/%E6%AF%8F%E6%97%A5%E8%AE%B ...
- java.lang.UnsupportedClassVersionError: com/my/test/TestUser : Unsupported major.minor version 52.0
问题原因: 1.执行代码的jdk版本 低于 编译的jdk版本 2.项目用JDK1.8运行过,现在又在本地的eclipse等开发工具或者本地环境变量为低版本的jdk1.7或者jdk1.6下运行,ecli ...
- Professional layer CodeForces - 1103D (状压,gcd)
大意: 给定$n$元素序列$a$, 现在想要让$gcd(a_1,a_2,...,a_n)=1$. 对于每个$a_i$可以除以一个不超过$k$的因子, 代价为$e_i$, 假设一共选择了$x$个元素去除 ...
- Bug in Code CodeForces - 420C (计数,图论)
大意: 给定$n$结点无向图, 共n条边, 有重边无自环, 求有多少点对(u,v), 满足经过u和v的边数>=p 可以用双指针先求出所有$deg_u+deg_v \ge p$的点对, 但这样会多 ...
- pytorch人脸识别——自己制作数据集
这是一篇面向新手的博文:因为本人也是新手,记录一下自己在做这个项目遇到的大大小小的坑. 按照下面的例子写就好了 import torch as t from torch.utils import da ...