前言:
主要讲解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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/* * * 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;
}<span style= "line-height: 1.5;" > </span>
|
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 {
|