虽然直接应用ODBC API编制应用程序相对来说较为繁琐,但是,由于直接使用ODBC API编写的程序相对要简洁、高效。所以,我们有必要学习直接使用ODBC API编程。

看图之王ACDSee 6.0应用大全 数码人像照片矢量化及艺术处理
六天学会Visual Basic数据库编程 解析“震荡波”恶性蠕虫病毒

  一般地,编写ODBC程序主要有以下几个步骤:

  分配ODBC环境

  分配连接句柄

  连接数据源

  构造和执行SQL语句

  取得执行结果

  断开同数据源的连接

  释放ODBC环境

  2.21 分配ODBC环境

  对于任何ODBC应用程序来说,第一步的工作是装载 驱动程序管理器,然后初始化ODBC环境,分配环境句柄。

  首先,程序中声明一个SQLHENV类型的变量,然后调用函数SQLAllocHandle,向其中传递分配的上述SQLHENV类型的变量地址和SQL_HANDLE_ENV选项。如下代码所示:

SQLHENV henv;

SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);

  执行该调用语句后,驱动程序分配一个结构,该结构中存放环境信息,然后返回对应于该环境的环境句柄。

  2.22分配连接句柄

  分配环境句柄后,在建立至数据源的连接之前,我们必须分配一个连接句柄,每一个到数据源的连接对应于一个连接句柄。

  首先,程序定义了一个SQLHDBC类型的变量,用于存放连接句柄,然后调用SQLAllocHandle函数分配句柄。如下代码所示:

SQLHDBC hdbc;

SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);

henv为环境句柄。

  2.23 连接数据源

  当连接句柄分配完成后,我们可以设置连接属性,所有的连接属性都有缺省值,但是我们可以通过调用函数SQLSetConnectAttr()来设置连接属性。用函数SQLGetConnectAttr()获取这些连接属性。

  函数格式如下:

SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);

SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);

  应用程序可以根据自己的需要设置不同的连接属性。

  完成对连接属性的设置之后,就可以建立到数据源的连接了。对于不同的程序和用户接口,可以用不同的函数建立连接:SQLConnect、SQLDriverConnect、SQLBrowseConnect。

  SQLConnect

  该函数提供了最为直接的程序控制方式,我们只要提供数据源名称、用户ID和口令,就可以进行连接了。

  函数格式:

SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3);

  参数:

   ConnectionHandle 连接句柄

   ServerName 数据源名称

   NameLength1 数据源名称长度

   UserName 用户ID

   NameLength2 用户ID长度

   Authentication 用户口令

   NameLength3 用户口令长度

  返回值:

   SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.

  成功返回SQL_SUCCESS,如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值。 
下面的代码演示了如何使用ODBC API的SQLConnect函数建立同数据源SQLServer的连接。 

#include “sqlext.h”

SQLHENV henv;;

SQLHDBC hdbc;

SQLHSTMT hstmt;

SQLRETURN retcode;

/*Allocate environment handle */

retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Set the ODBC version environment attribute */

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Allocate connection handle */

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Set login timeout to 5 seconds. */

SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0);

/* Connect to data source */

retcode = SQLConnect(hdbc, (SQLCHAR*) "Sales", SQL_NTS,

(SQLCHAR*) "JohnS", SQL_NTS,

(SQLCHAR*) "Sesame", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

/* Allocate statement handle */

retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Process data */;

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

}

SQLDisconnect(hdbc);

}

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

}

}

SQLFreeHandle(SQL_HANDLE_ENV, henv);

SQLDriveConnect

  函数SQLDriveConnect用一个连接字符串建立至数据源的连接。它可以提供比SQLConnect函数的三个参数更多的信息,可以让用户输入必要的连接信息。

  如果连接建立,该函数返回完整的字符串,应用程序可使用该连接字符串建立另外的连接。

  函数格式:

SQLRETURN SQLDriverConnect(SQLHDBC ConnectionHandle,SQLHWND WindowHandle,SQLCHAR InConnectionString,SQLSMALLINT StringLength1,SQLCHAR OutConnetionString,SQLSMALLINT BufferLength,SQLSMALLINT *StringLength2Ptr,SQLSMALLINT DriverCompletion);

  参数:

   ConnectionHandle 连接句柄

   WindowHandle 窗口句柄,应用程序可以用父窗口的句柄,或用NULL指针
 
   InConnectionString 连接字符串长度

   OutConnectionString 一个指向连接字符中的指针

   BufferLength 存放连接字符串的缓冲区的长度

   StringLength2Ptr 返回的连接字符串中的字符数

   DriverCompletion 额外连接信息,可能取值有:SQL_DRIVER_PROMPT,SQL_DRIVER_COMPLETE,
SQL_DRIVER_COMPLETE_REQUIRED, or SQL_DRIVER_NOPROMPT.

  返回值:

   SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.

   成功返回SQL_SUCCESS,如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值。 

   SQLBrowseConnect

   函数SQLBrowseConnect支持以一种迭代的方式获取到数据源的连接,直到最后建立连接。它是基于客房机/ 服务器的体系结构,因此,本地数据库不支持该函数。
  
  一般,我们提供部分连接信息,如果足以建立到数据源的连接,则成功建立连接,否则返回SQL__NEED__DATA,并在OutConnectionString参数中返回所需要的信息。

  函数格式:

SQLRETURN SQLBrowseConnect(SQLHDBC ConnectionHandle,SQLCHAR* InConnectionString,SQLSAMLLINT StringLength1,SQLCHAR* OutConnectionString,SQLSMALLINT BufferLength,SQLSMALLINT *StringLength2Ptr);

  参数:

   ConnectionHandle 连接句柄

   InConnectionString 指向输出字符串的指针

   StringLength1 输出字符串的指针长度

   OutConnectionString 指向输出字符串的指针

   BufferLength 用于存放输出字符串的缓冲区的长度

   StringLength2Ptr 实际返回的字符串的长度 

  返回值:

   SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.

  成功返回SQL_SUCCESS,如果返回值为SQL_ERROR或SQL_SUCCESS_WITH_INFO,可以用函数SQLGetDiagRec获取相应SQLSTATE的值。 

  下面的代码讲述了如何使用ODBC API的SQLBrowseConnect函数建立同数据源的连接。 

#define BRWS_LEN 100SQLHENV

henv;SQLHDBC hdbc;

SQLHSTMT hstmt;

SQLRETURN retcode;

SQLCHAR szConnStrIn[BRWS_LEN], szConnStrOut[BRWS_LEN];

SQLSMALLINT cbConnStrOut;/* Allocate the environment handle. */

retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Set the version environment attribute. */

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Allocate the connection handle. */

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Call SQLBrowseConnect until it returns a value other than */

/* SQL_NEED_DATA (pass the data source name the first time). */

/* If SQL_NEED_DATA is returned, call GetUserInput (not */

/* shown) to build a dialog from the values in szConnStrOut. */

/* The user-supplied values are returned in szConnStrIn, */

/* which is passed in the next call to SQLBrowseConnect. */

lstrcpy(szConnStrIn, "DSN=Sales"); do {

retcode = SQLBrowseConnect(hdbc, szConnStrIn, SQL_NTS,

szConnStrOut, BRWS_LEN, &cbConnStrOut);

if (retcode == SQL_NEED_DATA)

GetUserInput(szConnStrOut, szConnStrIn);

} while (retcode == SQL_NEED_DATA);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

/* Allocate the statement handle. */

retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

/* Process data after successful connection */ ...;

SQLFreeHandle(SQL_HANDLE_STMT, hstmt); }

SQLDisconnect(hdbc); } }

SQLFreeHandle(SQL_HANDLE_DBC, hdbc); }}

SQLFreeHandle(SQL_HANDLE_ENV, henv);

应用ODBC API建立应用程序相关推荐

  1. ODBC API 学习总结

    ODBC 编程API http://blog.csdn.net/bichenggui/article/details/5601381 转的ODBC API函数详细说明. 看了一遍,没有问题. 使用 O ...

  2. 你也可以玩转Skype -- 基于Skype API开发外壳程序入门

    原文:你也可以玩转Skype -- 基于Skype API开发外壳程序入门 Skype是目前这个星球上最厉害的IM+VOIP软件,Skype现在已经改变了全球2.8亿人的生活方式.你,值得拥有! :) ...

  3. java编写应用程序_使用Java API编写应用程序

    java编写应用程序 总览 介绍 DB2JSON可用于DB2 Linux,Unix和Windows 10.5以及用于z / OS V3.1的IBM DB2 Accessories Suite与DB2 ...

  4. DCMTK:部分元素访问API的应用程序

    DCMTK:部分元素访问API的应用程序 部分元素访问API的应用程序 部分元素访问API的应用程序 #include "dcmtk/config/osconfig.h" #inc ...

  5. Linux 串口编程三 使用termios与API进行串口程序开发

    在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解.事实上,快速掌握一项技术的核心点也是一种学习能力.对于使 ...

  6. libsvm java 实例_LibSVM Java API调用示例程序

    [实例简介] LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/804 ...

  7. 如何使用Native Messaging API 打开window程序

    问 如何使用Native Messaging API 打开window程序 cmd javascript terminal chrome Tychio 2013年03月26日提问 关注 1 关注 收藏 ...

  8. Angular和.NET Core Web API入门应用程序

    下载源160.2 KB 您可以在此处查看此项目的源代码和最新更新 这是Angular/.NET Core Web API入门应用程序,具有添加.编辑和删除客户的基本功能,因此您可以将其用作构建应用程序 ...

  9. 建立任务程序直接执行网页(.net)

    建立任务程序.设定时间和执行脚本等信息, 另外.net中该网站如果需要登录,而直接执行的网页需去掉登录验证的话需要在web.config中增加 <location path="xxx. ...

最新文章

  1. 文本框禁用后(readonly=readonly),光标置于文本框中按后退键,页面后退的解决方案...
  2. python【力扣LeetCode算法题库】46- 全排列
  3. [:zh]给机械课程设计的一封信[:] 2017-12-23
  4. python3 socketserver_Python3中的SocketServer
  5. 微信开发接口调用(前端+.net服务端)
  6. android常用工具收集
  7. 3D建模学什么?细分的话,有这么多方向
  8. 如何写出让人眼前一亮的硬核简历
  9. 12M电信宽带,为什么12台机器上网,总是掉线?有什么办法解决?请给位高手指教...
  10. MES助力中国制药行业 (GMP)
  11. MySQL 编码相关小结
  12. Java基础练习题(一维数组)
  13. 如何在网页下载腾讯视频为本地MP4格式
  14. 任正非《一江春水向东流》
  15. Windows科普:正版盗版系统有何不同?
  16. POJ 1950 Dessert
  17. NFT这么香,到底解决了什么问题?
  18. Oracle 手工锁表
  19. 【诡秘之主】封印物篇
  20. 2022年地图样萎缩(GA)市场深度分析及发展研究预测报告

热门文章

  1. “十年内难以落地”的无人驾驶,第一站会在哪里?
  2. chmod,rwx Linux文件属性笔记221107
  3. 关于div居中显示的问题
  4. Python机器人-QQ机器人-查询QQ报价?来看看你的QQ值多少钱!
  5. 哈工程计算机考研21年解读
  6. 【论文阅读】Cancelable Iris recognition system based on comb filter
  7. [RUST/腐蚀]Windows-开服服务端下载以及配置
  8. 某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,目每种票子至少一张。问:有几种换法?使用JavaScript进行换算。
  9. MySQL采用哪种数据模型_数据库的三种数据模型分别是什么
  10. excel一列求和_【乐活蒙城】“精通Excel”这种词,我劝你在简历中“慎用”!...