ODBC 安装/使用/编程

ODBC 安装/使用/编程前言:主要讲解ODBCAPI,以mysql为例,从配置到安装,再到具体的编程,以期对ODBC有个初步的认识.*)下载mysql,选择社区版mysql,并安装http://dev.m

大家好,又见面了,我是你们的朋友全栈君。

 前言:

  主要讲解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下, 这也是个差异点.

<span role="heading" aria-level="2">ODBC 安装/使用/编程

*) 在用户/系统DSN中, 添加DSN, 选择mysql-odbc, 如图所示:
<span role="heading" aria-level="2">ODBC 安装/使用/编程
  编辑DSN如图所示:
<span role="heading" aria-level="2">ODBC 安装/使用/编程

  在windows注册表目录项HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI下, 为具体的创建的DSN.

<span role="heading" aria-level="2">ODBC 安装/使用/编程

  数据源mysql_test为之前创建, 具体记录了详细的配置信息, 其中Driver具体对应 C:\Program Files (x86)\MySQL\Connector ODBC 5.3\myodbc5w.dll, database对应数据库test. 每个数据源其具体项各有区别. ODBC Data sources目录项, 记录了其他所有的数据源项, 方便告知驱动程序管理器具体odbc驱动器的数据源类型.
<span role="heading" aria-level="2">ODBC 安装/使用/编程
  用户DSN和系统DSN之间的区别, 用户DSN只对当前用户有效, 其所在的注册表的位置信息一般在HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI目录项下, 而系统DSN对所有用户都有效, 在HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI目录项下.

*) 在数据库test下, 创建

<span role="heading" aria-level="2">ODBC 安装/使用/编程

*)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;

} 

  附带ODBC的数据类型转换列表

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 {
     SQLSMALLINT year; 
     SQLUSMALLINT month; 
     SQLUSMALLINT day; 
} DATE_STRUCT;[a]

SQL_C_TYPE_TIME[c]

SQL_TIME_STRUCT

struct tagTIME_STRUCT {
     SQLUSMALLINT hour; 
     SQLUSMALLINT minute; 
     SQLUSMALLINT second; 
} TIME_STRUCT;[a]

SQL_C_TYPE_TIMESTAMP[c]

SQL_TIMESTAMP_STRUCT

struct tagTIMESTAMP_STRUCT {
     SQLSMALLINT year; 
     SQLUSMALLINT month; 
     SQLUSMALLINT day; 
     SQLUSMALLINT hour; 
     SQLUSMALLINT minute; 
     SQLUSMALLINT second; 
     SQLUINTEGER fraction;[b]
} TIMESTAMP_STRUCT;[a]

SQL_C_NUMERIC

SQL_NUMERIC_STRUCT

struct tagSQL_NUMERIC_STRUCT {
     SQLCHAR precision;
     SQLSCHAR scale; 
     SQLCHAR sign[g]
     SQLCHAR val[SQL_MAX_NUMERIC_LEN];[e], [f]
} SQL_NUMERIC_STRUCT;

SQL_C_GUID

SQLGUID

struct tagSQLGUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} SQLGUID;[k]

 

 
 
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154512.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 情感分析语料库——情感词典(中文英文)转[通俗易懂]

    情感分析语料库——情感词典(中文英文)转[通俗易懂]情感分析资源(转)中文的http://wenku.baidu.com/view/819b90d676eeaeaad1f3306e.html情感词典1.知网的情感词典-http://www.keenage.com/html/c_bulletin_2007.htm由知网发布的词典,包括中文情感词典和英文情感词典(以下需要论坛积分)2.台湾大学的情感极性词典-http:/…

    2022年8月23日
    19
  • 软件测试人员应该如何介绍自己测试过的项目工作_软件测试项目介绍

    软件测试人员应该如何介绍自己测试过的项目工作_软件测试项目介绍测试人员在找工作的过程中,通常有一个问题是很难绕开的。就是要如何向别人介绍自己之前做过的项目。下面我们就这个问题简单的做一些分析。要解决这个问题,大体上可以分为如下几个步骤:1、对项目进行基本介绍2、说明自己负责测试的模块3、针对部分模块展开进行说明一.对项目进行基本介绍以下就以一个简单的项目进行介绍说明:最近测试的Tpshop项目是一个B/S架构的Web项…

    2022年10月20日
    1
  • Vue一到三年面试题总结

    Vue一到三年面试题总结笔者粉丝群里的朋友们多部分的人都在找vue的工作而没有再找react工作,所以我之前总结的html,css,js,react面试题还不行,还要继续拓展vue的。。于是我就把大家在出去面试的时候遇到的vue面试题以粉丝们投稿的方式收集了起来做个汇总,希望能帮助到更多的朋友们~Vue面试题正文:1.vue全家桶包含哪些?答案:vue全家桶与react全家桶介绍2.v-model是什么?怎么使…

    2022年6月11日
    38
  • QR分解_矩阵谱分解例题

    QR分解_矩阵谱分解例题病态矩阵测量是人类对居住的这个世界获取空间认识的一种手段,也是认识世界的一种活动。因此,在参与测量活动中,自然会遇到认识活动中的三种情况:a.很容易就发现了不同之处而将甲乙两事物区分开来;b.很容易

    2022年8月6日
    8
  • java遍历数组取出最大值_求数组20个数的平均值

    java遍历数组取出最大值_求数组20个数的平均值求平均值与最大值实现前需要懂得如何获取数组长度实现数组遍历例如:int[]array={2,3,6,8,18};for(inti=0;i<array.length;i++){System.out.print(array[i]+”,”);}输出结果:2,3,6,8,18求最大值时则采用擂台制现默认一个数为最大值(max)使用循环遍历数组中的每个数进行两两比较从而得出最大值。实现代码importjav

    2022年9月19日
    2
  • word2vec原理与实现「建议收藏」

    word2vec原理与实现「建议收藏」定义word2vec是一种把词转到某种向量空间的方法,在新的向量空间,词之间的相互关系,上下文关系都以某种程度被表征出来。方法词向量的转换方法有两种:CBOW(Continounsbagsofwords)和Skip-gram。以下图示为CBOW的网络结构图上图中的x1,x2,….Xc代表的是源码中的context向量中的每个单词,这个上下文的窗口大小对每个词都是随…

    2022年5月16日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号