2.2 应用ODBC API建立应用程序

  虽然直接应用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);

用VC++开发数据库应用程序(二)相关推荐

  1. 在VC中使用ADO开发数据库应用程序

    在VC中使用ADO开发数据库应用程序 一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 ...

  2. 第十三章 Delphi开发数据库应用程序概述(二)

    数据控制部件页上的部件,主要用于设计用户界面,对数据库中的数据进行浏览.编辑.插入.删除等操作.因而数据控制部件常常又被称为数据浏览部件,数据控制部件其实是在Standard页上的标准部件的基础上,相 ...

  3. 房地产—客户关系管理系统CRM|软件开发|软件外包|程序二次开发

    房地产-客户关系管理系统CRM|软件开发|软件外包|程序二次开发 主要:CRM管理,合同管理,绩效管理 1.CRM管理:新增客户,我的资源,公共资源,客户跟进,待审批客户,报备资源,审核释放,预约到访 ...

  4. ACCP学习旅程之-----使用C#开发数据库应用程序(第二章)

    基本循环语句while.do-while.for循环与Java完全一样        引入的一种新的循环----foreach 1¥ foreach循环 语法: foreach(类型 元素(局部变量) ...

  5. 【小程序】node/小程序云开发生成小程序二维码并添加文件到云存储/腾讯云存储

    [前情提要] 1-小程序云函数生成小程序码 2-小程序云函数上传到云存储,云存储包括 小程序云存储/腾讯云存储 (因为云函数 就是node.js语法写的吗,所以下面写法对于node同样适用) 3-这里 ...

  6. java开发微信小程序——二维码生成

    https://blog.csdn.net/persistencegoing/article/details/84376427 工具类: public class TwoCode {         ...

  7. 基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)

    -- ---------------------------- -- Table structure for erp_goods -- ---------------------------- DRO ...

  8. 用vc对oracle数据库编程,用VC开发基于ORACLE数据库应用程序

    用VC开发基于ORACLE数据库应用程序 徐智文 [期刊名称]<包钢科技> [年(卷),期]2006(032)001 [摘要]VC++是一个强大的客户端开发工具,可以很方便地开发出基于PR ...

  9. MFC 利用小型数据库Access 少步惆 教你用VC开发

     目录(?)[+] 情境一     面向对象基础应用 任务类的声明及成员的访问控制 任务构造函数和析构函数的应用 任务成员函数的应用 任务继承性的作用 任务函数的重载的应用 任务虚函数的使用 任务 ...

最新文章

  1. [转载] 晓说——第3期:梦回青楼 爱与自由的温柔乡(上)
  2. 软件破解系列之OD中断方法
  3. 《Linux内核设计与实现》读书笔记 - 目录 (完结)
  4. 深入理解WMS(二):Dialog与Toast源码解析
  5. 谈“技术含量”的问题
  6. 颜色空间缩减color space reduction
  7. 由已打开的文件读取数据---read
  8. m2eclipse简单使用,创建Maven项目 ,运行mvn命令(转)
  9. java抓取动态生成的网页
  10. 第二章 身份验证——《跟我学Shiro》[张开涛]
  11. pano2vr保存的html打不开,pano2VR输出文件打不开
  12. 谈谈自己对移动互联网的看法
  13. 网易云音乐8.0版本背后的野心
  14. css3 模糊渐变,css3实现背景色渐变linear-gradient()
  15. 餐馆管理系统程序流程图_这个交付应用程序使您最喜欢的中国餐馆保持活力
  16. 《My Fair Lady》All I want is a room somewhere
  17. 安科瑞水电气三表集抄电能管理系统在阿克希龙公司的设计方案
  18. pandas 选取指定列
  19. 树莓派+motion实现局域网简单监控
  20. 这些「知识点」,你 Get 到了吗?【本周神经回顾】

热门文章

  1. if判断时,常量最好写左边
  2. java rrdtool_RRDtool简体中文教程 v1.01(转载)
  3. vue-cli 版本3.0项目搭建和详解
  4. Linux下qt实现个人资源管理功能:记事本,图片浏览,网络聊天,数据库管理
  5. html 面包屑 模板,Emlog模板制作之面包屑导航(参考教程)
  6. 快速解决IP地址冲突问题的方法
  7. Django 讲解
  8. cqrs java_Java的CQRS和事件溯源ES入门:如何从CRUD切换到CQRS/ES - Baeldung
  9. 微信小程序获取位置后只显示省市
  10. 大数据开发遇坑大杂烩