编程实例——ODBC篇_第1页
编程实例——ODBC篇_第2页
编程实例——ODBC篇_第3页
编程实例——ODBC篇_第4页
编程实例——ODBC篇_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、达梦接口编程实例一一ODBC篇ODBQOpen Database Connectibvity )是被人们广泛接受的用于数据库访问的标准API (应用程序编程接口)。对于数据库 API,它以X/Open和ISO/IEC的Call-LevelInterface(CLI) 规范为基础,并使用结构化查询语言(SQL作为其数据库访问语言。结构化查询语言SQL是一种用来访问数据库的语言。通过使用ODBC应用程序能够使用相同的源代码和各种各样的数据库交互。这使得开发者不需要以特殊的数据库管理系统DBMS目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。达梦数据库(DM DA

2、TABASE以下简称 DM的 DM ODBC 3.0遵照 Microsoft ODBC 3.0 规范设计 与开发,实现了 ODBCS用程序与 DM的互连接口。用户可以直接调用 DMODBC3.0接口函数访问DM 也可以使用可视化编程工具如 Visual C+、C+ Builder、PowerBuilder 等利用DM ODBC 3.0访问 DM本文中以武汉达梦数据库公司的DMODBC3.0驱动程序为实例,以Visual C+为工具,在Windows2000 Professio nal操作系统上,用一个实例来介绍DM ODBC勺编程方法。1创建DM ODB(数据源在DM客户端软件安装过程中,如果

3、选择了安装ODB动程序的相关选项,安装工具可完成将DM ODBC 3.0驱动程序复制到硬盘,并在Win dows注册表中登记 DM ODBC区动程序信息的工作。在使用DM ODB(方法访问一个DM数据库服务器之前,必须先对自己的应用程序所用的ODBC资源进行配置。在客户机上配置DM ODB(资源的步骤如下:1.1依次打开控制面板-管理工具-数据源(ODBC)显示ODBC数据源管理器对话框,如图1.1.1所示。图1.1.1 ODBC数据源管理器对话框1.2设置和配置一个系统 DSN请单击系统 DSN标签,单击添加按钮增加一个新的DSN显示如图1.1.2所示的对话框。2d创建番數雰源名称iliM

4、oweDRTVEROrODBC Driver SQL Server选择您:揑为苴安装数据诱的驰动稈序迄)O版本1. 00.0i0.018.01.06.00Z000. ai.9030.04公司 华工达梦螯 Ortel CoMicroioft衬I11上一完成 | 取消 |图1.1.2创建新数据源对话框1.3选择DM ODBC 3.0驱动程序,即 DM ODBC DRIVER单击完成按钮,显示如图1.1.3所示的DM ODBC 3.0数据源配置对话框。图1.1.3创建新的DM数据源对话框1.4输入数据源的名称,一个简单的描述,并选择你想要连接的数据库服务器的名字,使用的 端口号,缺省使用的DB,验证

5、登录用户ID真伪的方式,如果使用 DM Server验证方式则需要输入登录数据源的ID以及密码等信息,选择系统提示信息的语种,以及选择是否使用 选项。1.5单击测试按钮测试你配置的数据源是否正确,得到数据源测试报告如图DMServer的增强1.1.4所示,如果测试成功,可以单击确定按钮以保存你设置的新的系统数据源,如图1.1.5所示。图3.1.4数据源测试报告图3.1.5完成系统数据源的设置1.6单击确定按钮关闭 ODB(数据源管理器对话框。2、DM ODBC应用程序编写的基本步骤使用DM ODB编程的基本步骤如图 2.1所示。图2.1直接使用DM ODB(函数开发应用程序的基本步骤2.1 申

6、请环境与连接句柄客户程序要和一个远程的服务器或数据库进行通讯, 必须首先和这个服务器或数据库建立连接,如何通过ODBC!立一个连接以及使用连接呢?是我们下面将要介绍的内容。为了建立一个ODB(数据源连接,需要使用到环境句柄以及连接句柄。句柄有一个层次的概念, 一个连接句柄总是和一个唯一的环境句柄相联系的, 所有的连接句柄必须在环境句柄释放之前释放。 客户程序可以通过调用函数 SQLAllocHandle 来申请一个环境句柄,调用函数 SQLAllocHandle 时必 须传入句柄选项 SQL_HANDLE_EN当申请环境句柄成功之后,可以在此环境句柄上申请连接句柄。申请环境句柄和连接句柄的代码

7、示范如下:#include #include #include #include /*检测返回代码是否为成功标志,当为成功标志返回TRUE否则返回FALSE */#define RC_SUCCESSFUL(rc) (rc) = SQL_SUCCESS | (rc) = SQL_SUCCESS_WITH_INFO)/*检测返回代码是否为失败标志,当为失败标志返回TRUE否则返回FALSE */#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc)HENVhenv;/*环境句柄*/HDBChdbc;/*连接句柄*/SQLRETURNsret;/*返回代码

8、*/void main(void)/* 申请一个环境句柄 */SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);/* 申请一个连接句柄 */SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 2.2声明应用程序的 ODBC版本在应用程序分配连接之前,必须先设置SQL_ATTR_ODBC_VERSI环境属性。这个属性说明应用程序是遵循 ODBC 2.x还是ODBC 3.x规范。设置环境句柄的 ODBC版本属性的代码范例如下:HENV henv; /* 环境句柄 */SQLSetEnvAttr(henv,SQL_ATTR_

9、ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);2.3 连接数据源或驱动程序ODBC的连接是从数据源开始的,数据源是ODBC对一个特定的数据库的别称。为了访问由数据源提供的数据,你的程序中必须首先建立和数据源之间的连接,在环境和连接句柄正确分配之后, 才能通过这些连接管理数据访问。连接 ODBC数据源时,ODBC提供三种不同的连接函数,即SQLConnec、SQLDriverConnect 和SQLBrowseConnec,t 每个函数都有不同的参数以及不同级别的一致性。SQLConnect是连接ODBC数据源的最基本的方法,在所有

10、的一致性级别上都支持。SQLConnect函数有以下参数:连接句柄,数据源名称,数据源名称长度,用户名(用户ID),用户名长度,用户口令以及口令长度。返回代码有:SQL_SUCCE,SSQL_SUCCESS_WITH_I,NFSOQL_ERROR或者SQL_INVALID_HANDLE使用SQLConnect函数连接数据源的代码示范如下:HDBC hdbc; /* 连接句柄 */sret = SQLConnect(hdbc, (SQLCHAR *)DM4, SQL_NTS, (SQLCHAR*)SYSDBA, SQL_NTS, (SQLCHAR *)SYSDBA, SQL_NTS);if (R

11、C_NOTSUCCESSFUL(sret) /* 连接数据源失败 ! */进行相应的错误处理exit(0);SQLDriverConnect提供了比SQLConnect更灵活的方法来建立 ODBC连接。它支持:要求更多连 接参数的数据源;对话框提示用户输入所有的连接信息;以及没有在系统信息表中定义的数据源。SQLDriverConnect 提供以下的连接方法:(1) 用一个连接字符串建立一个连接,这个字符串包括建立连接的所有数据,如DSN 一个或 多个用户 ID 及其口令,以及其他的数据库所需要的连接信息。(2) 用一个并不完整的连接字符串来建立连接,使得ODBC驱动程序管理器来提示用户输入所

12、 需要的连接信息。(3) 用一个没有在系统信息表中登记的数据源建立连接,驱动程序自动提示用户输入连接信息。(4) 用一个连接字符串建立连接,这个字符串在DSN配置文件中是确定的。SQLDriverConnect 函数 fDriverCompletion 参数说明:(1) SQL_DRIVER_PROM设置此选项用来显示一个对话框来提示用户输入连接信息。(2) SQL_DRIVER_COMPLE如果函数调用中包含了足够的信息,ODBC 就进行连接,否则弹出对话框提示用户输入连接信息,此时等同于SQL_DRIVER_PROMPT(3) SQL_DRIVER_COMPLETE_REQUIR这个参数与

13、 SQL_DRIVER_COMPLE参数唯一的不同是用 户不能改变由函数提供的信息。(4) SQL_DRIVER_NOPROM如果函数调用时有足够的信息, ODBC就进行连接,否则返回 SQL_ERROR使用 SQLDriverConnect 连接数据源的代码示范如下:HDBC hdbc;/* 连接句柄 */SQLCHARszConnStrIn256=DSN=DM4;DRIVER=DMODBCDRIVER;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA;SQLCHAR szConnStrOut256;SQLSMALLINT cbConnStrOut;sret = S

14、QLDriverConnect(hdbc, hwnd, szConnStrIn, SQL_NTS, szConnStrOut, 256, &cbConnStrOut, SQL_DRIVER_PROMT);if (RC_NOTSUCCESSFUL(sret) /* 连接数据源失败 ! */进行相应的错误处理 exit(0);SQLBrowseCo nnect 函数时,SQLBrowseConnect 函数与 SQLDriverConnect 函数相似,但是调用 程序在运行时可以再形成一个连接字符串,使用这个函数可以用一个交互的方式来决定连接到数据 源时所需要的一些信息。使用 SQLBrowseC

15、onnect 函数连接数据源的代码示范如下:HDBC hdbc;/* 连接句柄 */SQLCHARszConnStrIn256=DRIVER;DATABASE=SYSTEM;UID=SYSDBA;PWD=SYSDBA;SQLCHAR szConnStrOut256;SQLSMALLINT cbConnStrOut;sret = SQLBrowseConnect(hdbc, szConnStrIn, &cbConnStrOut);if (RC_NOTSUCCESSFUL(sret) /* 连接数据源失败 ! */进行相应的错误处理exit(0);DSN=DM4;DRIVER=DMSQL_NTS,

16、 szConnStrOut,ODBC256,2.4 设置与取得连接的属性建立连接之后,应用程序可以通过调用 SQLSetConnectAttr 全方面的管理。具体的连接属性,用户可以参考 DM程序员手册 可以通过调用 SQLGetConnectAttr 函数来取得当前连接的属性。设置与取得连接属性的代码示范如下:函数来设置连接属性,对连接进行,在这里不做介绍了。应用程序HDBC hdbc; /* 连接句柄 */ SQLINTEGER AUTOCOMMIT_MODE; /* 设置连接句柄属性,关闭自动提交功能 SQLSetConnectAttr(hdbc, (SQLPOINTER)SQL_AUT

17、OCOMMIT_OFF,SQL_IS_INTEGER);/* 取得连接句柄属性,取得提交的模式 */ SQLGetConnectAttr(hdbc, (SQLPOINTER)&AUTOCOMMIT_MODE,sizeof(SQLINTEGER), NULL);*/SQL_ATTR_AUTOCOMMIT,SQL_ATTR_AUTOCOMMIT,2.5 分配和设置语句句柄ODBC应用程序通过执行 SQL语句完成它们几乎所有的数据库访问。在应用程序执行语句之前, 它必须要先分配语句句柄。分配语句句柄的范例代码如下:HSTMT hsmt; /* 语句句柄 */SQLAllocHandle(SQL_HA

18、NDLE_STMT, hdbc, &hsmt);语句属性就是语句的特征。 例如,是否使用书签和对语句的结果集使用哪种游标就是语句属性。 语句属性用 SQLSetStmtAttr 设置,且它们的当前设置用 SQLGetStmtAttr 检索。对于应用程序设置 任何属性没有什么要求;所有语句属性都有缺省,其中一些是驱动程序指定的。2.6 执行语句执行语句有四种方法 (直接执行、准备执行、过程、编目函数 ) ,这取决于数据库引擎编译准备 它们的时间及谁定义它们。直接执行是执行语句最简单的方法。直接执行常常为在运行时建立和执行语句的普通应用程序 所执行。直接执行的范例代码如下:HSTMT hsmt;

19、/* 语句句柄 */SQLExecDirect(hsmt,(SQLCHAR*)CREATE TABLE TEST_TABLE(COL0 INT,COL1 CHAR(10); ,SQL_NTS);准备执行是多次执行一条语句的有效途径。语句首先被编译或准备成一个访问计划。接着,在 以后的时间里,该访问计划将一次或多次执行。准备执行的范例代码如下 :HSTMT hsmt; /* 语句句柄 */SQLPrepare(hsmt,(SQLCHAR*)CREATE TABLE TEST_TABLE(COL0 INT,COL1 CHAR(10); ,SQL_NTS); /* 准备语句 */SQLExecute

20、(hsmt); /* 执行语句 */过程是存储在数据源上的可执行对象。一般来说是已预先编译好的一个或多个SQL语句。执行过程的范例代码如下:HSTMT hsmt; /* 语句句柄 */SQLExecDirect(hsmt,(SQLCHAR*) “create or replace procedure test_proc (c1 in int) ”a ”“as”“declare c2 int ”a .”“begin ”“c2 := c1 + 100 ”“end;”, SQL_NTS); /* 创建存储过程 */SQLExecDirect(hsmt,(SQLCHAR*)”call test_pro

21、c(123);”,SQL_NTS); /* 调用存储过程 */所有数据库都有一个概括如何在本数据库中保存数据的结构。这个结构连同其他信息,如权限 等,保存在一套叫做数据库编目的系统表中,即数据字典( data dictionary ) 。应用程序可以通过 对编目函数的调用发现这个结构。 编目函数在结果集中返回信息, 并通常经过对编目中各表的 SELECT 语句来实施。执行编目函数的范例代码如下:HSTMT hsmt; /* 语句句柄 */*SQLProcedures(hsmt, “SYSTE”M ,SQL_NTS“, SYSDB”A ,SQL_NTS“, TEST_PRO”C,SQL_NTS)

22、此函数来获取DM存储过程与函数的字典信息*/SQLProcedureColumns(hsmt,“SYSTE”M ,SQL_NTS“, SYSDB”A ,SQL_NTS“, TEST_PRO”C,SQL_N TS,NULL,0) /* 返回存储模块的参数信息 */2.7 语句参数参数就是SQL语句中的变量。SQL语句中的每个参数在执行该语句之前必须与应用程序中的变 量相关,即绑定。运用参数绑定的代码范例如下:HSTMT hsmt;/*语句句柄 */char buf10;/* 此缓冲区用于存放参数数据 */longlen;/*此缓冲区用于存放参数长度 */SQLExecDirect(hsmt, (

23、SQLCHAR*)CREATETABLETEST_TABLE(COL0char(10), SQL_NTS); /* 创建表 */SQLPrepare(hsmt, (SQLCHAR*)INSERT INTO TEST_TABLE(COL0)VALUES(?), SQL_NTS); /* 准 备插入数据 */SQLBindParameter(hsmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,buf,10,&len); /* 绑定参数 */memset(buf,A,10);len = SQL_NTS;SQLExecute(hsmt); /* 执行语句 *

24、/2.8 绑定结果集和获得数据从数据源上获取的数据返回到应用程序中为此而分配的变量中。在这些完成之前,应用程序必 须为结果集中的列关联或绑定这些变量。应用程序调用SQLBindCol 绑定列,这个函数每次绑定一列。从结果集中检索行并将它们返回给应用程序的过程叫获取,应用程序用游标(cursor)来获取数据。为获取一行数据,应用程序可调用SQLFetch。SQLFetch能够以任何形式的游标调用SQLFetch,但它只能在向前的方向上移动行集游标。而使用 SQLFetchScroll 从结果集合中取指定行集的数据并返 回所有被绑定列的数据。行集可以按绝对或相对位置或按书签来指定。HSTMThsm

25、t;/* 语句句柄 */charszcode6;/*厂商编号 */longcbcode = 0;charszname21; /*厂商名 */longcbname = 0;charszasset13;/* 资产总值 */longcbasset = 0;charszaddress11;/*厂商地址 */longcbaddress = 0;SQLExecDirect(hsmt, (SQLCHAF*)SELECT厂商编号,厂商名,资产总值,厂商地址FROM厂 商登记;, SQL_NTS);/* 绑定数据缓冲区 */SQLBindCol(hsmt, 1, SQL_C_CHAR, szcode, sizeof(szcode), &cbcode);SQLBindCol(hsmt, 2, SQL_C_CHAR, szname, sizeof(szname), &cbname);SQLBindCol(hsmt, 3, SQL_C_CHAR, szasset, sizeof(szasset), &cbasset);SQLBindCol(hsm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论