使用ODBC所需要的文件
1、sql.h : 包含基本的ODBC API的定义。
2、sqlext.h
:包含扩展的ODBC的定义。
3、odbc32.lib :库文件。
例如:
#include
<sqlext.h>
#include <sql.h>
#include
<odbcinst.h>
#pragma comment(lib, "odbccp32.lib")
#pragma
comment(lib, "odbc32.lib")
一、配置ODBC数据源
配置ODBC数据源可以通过手动配置 和 程序自动配置
两种方式来实现。
第一种:手动配置(不作说明)
第二种:程序自动配置
SQLRETURN retcode;
retcode =
SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb,
*.accdb\0","DSN=Victor\0DBQ=D:\\MyDataBase\\Victor.accdb\0DEFAULTDIR=D:\\MyDataBase\0");
if(!retcode)
{
AfxMessageBox("配置ODBC数据源失败!");
return;
}
ODBC API提供了动态创建数据源的函数SQLConfig DataSource。该函数的原型如下:
BOOL
SQLConfigDataSource(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR
lpszAttributes);
参数说明如下:
1、参数hwndParent用于指定父窗口句柄,在不需要创建数据源对话框时,可以将该参数指定为NULL。
2、参数fRequest用于指定函数的操作内容,取值如下:
ODBC_ADD_DSN:
加入一个新的用户数据源;
ODBC_CONFIG_DSN:修改一个存在的用户数据源;
ODBC_REMOVE_DSN:除一个存在的用户数据源;
ODBC_ADD_SYS_DSN:增加一个新的系统数据源;
ODBC_CONFIG_SYS_DSN:配置或者修改一个存在的系统数据源;
ODBC_REMOVE_SYS_DSN:删除一个存在的系统数据源;
ODBC_REMOVE_DEFAULT_DSN:删除省缺的数据源说明部分。
3、参数lpszDriver用于指定ODBC数据源的驱动
例如,为了指定Access数据源,该参数应赋以字符串"Microsoft
Access Driver (*.mdb, *.accdb)\0";对SQL SERVER数据源,则应赋以字符串"SQL
Server"。
4、参数lpszAttributes用于指定ODBC数据源属性。例如:
4.1
对Access数据源:
"DSN=Victor\0DBQ=D:\\MyDataBase\\Victor.accdb\0DEFAULTDIR=D:\\MyDataBase\0"
说明:该字符串指定数据源名称(DNS)为Victor;数据库文件(DBQ)为D:\\MyDataBase\\Victor.accdb;缺省数据库文件路径(DEFAULTDIR)为D:\\MyDataBase。
4.2 对SQL SERVER数据源:
"DSN=Victor\0SERVER=MYET\0
DATABASE=Image"
说明:该字符串指定数据源名称(DSN)为MYIMAGE;SQLSERVER
数据库服务器名(SERVER)为MYET;数据库名称(DATABASE)为Image。
二、分配ODBC环境并设置ODBC环境属性
对于任何ODBC应用程序来说,第一步的工作是装载驱动程序管理器,然后初始化ODBC环境,分配环境句柄。ODBC驱动程序管理器使用该环境句柄跟踪每一个ODBC连接及其状态。
//分配环境句柄
SQLHENV
henv;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
&henv);
if(!(retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO))
{
AfxMessageBox("分配环境句柄失败!");
return;
}
执行该调用语句后,驱动程序分配一个结构,该结构中存放环境信息,然后返回对应于该环境的环境句柄。
然后ODBC应用程序必须调用SQLSetEnvAttr函数,这个函数注册将要使用的ODBC
API版本。
//设置ODBC环境属性
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3,0);
if(!(retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_ENV,
henv);
AfxMessageBox("设置ODBC环境属性失败!");
return;
}
三、分配连接句柄
分配环境句柄后,在建立至数据源的连接之前,必须分配一个连接句柄,每一个到数据源的连接对应于一个连接句柄。
//分配连接句柄
SQLHDBC
hdbc;
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv,
&hdbc);
if(!(retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_ENV,
henv);
AfxMessageBox("分配连接句柄失败!");
return;
}
四、连接数据源
当连接句柄分配完成后,可以设置连接属性,所有的连接属性都有缺省值,但是可以通过调用函数SQLSetConnectAttr()来设置连接属性。用函数SQLGetConnectAttr(0获取这些连接属性。
//设置最长登录时间为5s
SQLSetConnectAttr(hdbc,
SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
完成对属性的设置之后,就可以建立到数据源的连接了。对于不同的程序和用户接口,可以用不同的函数建立连接:SQLConnect、SQLDriverConnect、SQLBrowseConnect.
SQLConnect()提供了最为直接的程序控制方式,只要提供数据源名称、用户ID和口令就可以进行连接了。
//连接到数据源
retcode
= SQLConnect(hdbc, (SQLCHAR*)"Victor", SQL_NTS, NULL , 0, NULL,
0);
if(!(retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_DBC,
hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,
henv);
AfxMessageBox("连接数据源失败!");
return;
}
五、分配语句句柄
最后一段ODBC初始化代码是调用SQLAllocHandle函数创建一个语句句柄。该语句句柄用于处理SQL请求。
//分配语句句柄
SQLHSTMT
hstmt;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc,
&hstmt);
if(!(retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO))
{
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,
hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,
henv);
AfxMessageBox("分配语句句柄失败!");
return;
}