• 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_MACHINESOFTWAREODBCODBCINST.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_MACHINESOFTWAREWow6432NodeODBCODBCINST.INI下, 这也是个差异点.

    *) 在用户/系统DSN中, 添加DSN, 选择mysql-odbc, 如图所示:

      编辑DSN如图所示:

      在windows注册表目录项HKEY_CURRENT_USERSOFTWAREODBCODBC.INI下, 为具体的创建的DSN.

      数据源mysql_test为之前创建, 具体记录了详细的配置信息, 其中Driver具体对应 C:Program Files (x86)MySQLConnector ODBC 5.3myodbc5w.dll, database对应数据库test. 每个数据源其具体项各有区别. ODBC Data sources目录项, 记录了其他所有的数据源项, 方便告知驱动程序管理器具体odbc驱动器的数据源类型.

      用户DSN和系统DSN之间的区别, 用户DSN只对当前用户有效, 其所在的注册表的位置信息一般在HKEY_CURRENT_USERSOFTWAREODBCODBC.INI目录项下, 而系统DSN对所有用户都有效, 在HKEY_LOCAL_MACHINESOFTWAREODBCODBC.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!
    ");
    		} else {
    			printf("name:%s, age:%ld
    ",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]

     

     
     
     
  • 相关阅读:
    iOS 学习
    swift
    (九)Javabean与Jsp(来自那些年的笔记)
    (八)JSP 技术知识点总结(来自那些年的笔记)
    java抽象工厂模式
    java工厂方法模式
    java的简单工厂模式
    服务提供者框架讲解 之 myJDBC
    第一条:考虑用静态工厂方法代替构造器
    另辟蹊径的归并排序复杂度分析
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/3718457.html
Copyright © 2020-2023  润新知