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;

} 
  附帶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]

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM