通过ODBC API实现对数据库的访问 Mr

使用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;
}

原文地址:https://www.cnblogs.com/miaohw/p/2147379.html