`

DB2 UDB 连通性快捷表 第 4 部分

    博客分类:
  • DB2
阅读更多

http://www.chinaitpower.com/A200508/2005-08-08/186502.html

 

Raul F. Chong, 数据库顾问, IBM
Jalud Abdulmenan, 数据库顾问

2004 年 3 月

本文的焦点是使用 C 和 Java 语言讨论工作站上的 DB2 UDB 应用程序开发的连通性。

简介
这是第四篇讨论连通性应用场景的文章,其中包括 IBM® DB2® Universal Database TM(UDB)for Linux, UNIX® and Windows® version 8(fixpak 4)、DB2 UDB for iSeries TM 5.2(从 2003 年 12 月起为维护级别)以及 DB2 UDB for z/OS® V8(本文撰写之时,DB2 UDB for z/OS version 8 尚未广泛发布。用于测试场景的是 DB2 for OS/390、z/OS v7 以及从 2003 年 12 月起为维护级别的 V8 beta 版。)。与该系列的 第 3 部分一样,本文使用的也是最新版本;不过文中介绍的方法也可能适用于其他的版本。

本文的焦点是使用 C 和 Java 语言的工作站应用程序开发的连通性。我们将提供使用 JDBC TM、SQLJ、ODBC 等在工作站平台(Linux、UNIX 以及 Windows)上开发的示例程序,其中每个程序都将连接到 DB2 UDB 数据库(任何平台),查询 SYSIBM.SYSDUMMY1 表以及断开连接。请务必使用拥有访问该表的正确权限的用户 ID 来运行这些程序。这些程序是在 Service Pack 4 级别的 Microsoft® Windows 2000 平台上测试的,但是应该也可以移植到 UNIX 和 Linux 平台上。由于篇幅限制,我们所提供的每个示例程序的代码清单只带有最少的注释和错误检查(不过功能仍然齐全)。要获得完整的实用示例程序,请下载本文附带的文件。

该系列的第五篇文章中将介绍 ADO 和 ADO.NET,而第六篇文章中还将介绍其他语言。我们不会讨论在 z/OS、OS/390 或 iSeries 中本地编写的程序。请注意,我们假定您已经具备了一些编程的背景知识;因此,我们不会介绍编程技巧,以及一般是如何编码的。

作为顾问,我们经常将示例程序放在手边,用以测试应用程序连通性的设置是否正确。本文中的示例程序也可以用于此目的。在 DB2 UDB for Linux、UNIX 和 Windows V8 中,您现在可以使用配置助手(Configuration Assistant,CA)来测试多种类型的连接。不过,从 DB2 UDB 的先前版本中也可得到这些示例程序。根据所提供的源代码,示例程序还提供了关于连通性设置的更多详细信息。

本文对于 DBA 应该也是有用的,即使他们通常都无需给程序编码。因为在与应用程序开发人员交流时,对于如何编写要连接和访问 DB2 数据库的程序有基本的理解将很有益。

本文中的程序是基于为其提供了 DB2 UDB 应用程序开发客户机(DB2 UDB Application Development client)的示例程序(在目录 sqllib/samples 下)的;然而为了便于理解,已将它们简化了。

本文将描述下列连通性的应用场景:

C/C++:

  • 场景 1:使用 CLI 连接 DB2 UDB 数据库
  • 场景 2:使用 ODBC 连接 DB2 UDB 数据库
  • 场景 3:使用嵌入式 SQL 和宿主语言 C 连接 DB2 UDB 数据库

Java:

  • 场景 4:使用 SUN type 1 驱动程序(JDBC - ODBC 桥)连接 DB2 UDB 数据库
  • 场景 5:使用 IBM DB2 UDB type 2 驱动程序(App 驱动程序)连接 DB2 UDB 数据库
  • 场景 6:使用 IBM DB2 UDB type 2 驱动程序(通用驱动程序)连接 DB2 UDB 数据库
  • 场景 7:使用 IBM DB2 UDB type 3 驱动程序(网络驱动程序)连接 DB2 UDB 数据库
  • 场景 8:使用 IBM DB2 UDB type 4 驱动程序(通用驱动程序)连接 DB2 UDB 数据库
  • 场景 9:使用 SQLJ 连接 DB2 UDB 数据库

假定所使用的协议为 TCP/IP 协议,因为这是最常使用的协议。我们只列出基本的设置信息。

请注意,我们描述的场景为两层环境。对于 n层环境,则只要将“machine 1”作为执行 C 或 Java 程序的系统来考虑。

下面描述的所有场景中,均在测试机器中设置了下列 Windows 2000 环境变量。其中大多数环境变量是在安装 DB2 UDB 时自动设置的。请注意,对于部分示例程序,我们使用 MS Visual Studio V6 进行编译,这在某些环境变量的值中得到了反映。而在 UNIX/Linux 平台中,某些变量名稍微有点不同。请务必根据您自身的环境,适当地设置这些变量:

表 1. 必需的 Windows 2000 环境变量

环境变量
CLASSPATH .;C:\\PROGRA~1\\SQLLIB\\java\\db2java.zip;C:\\PROGRA~1\\SQLLIB\\java\\db2jcc.jar;C:\\PROGRA~1\\SQLLIB\\java\\sqlj.zip;C:\\PROGRA~1\\SQLLIB\\bin;C:\\PROGRA~1\\SQLLIB\\java\\common.jar;C:\\PROGRA~1\\SQLLIB\\java\\db2jcc_license_cisuz.jar;C:\\PROGRA~1\\SQLLIB\\java\\db2jcc_license_cu.jar;
INCLUDE C:\\PROGRA~1\\SQLLIB\\INCLUDE;C:\\PROGRA~1\\SQLLIB\\LIB
LIB C:\\WINNT\\system32;C:\\Program Files\\Microsoft Visual Studio\\VC98\\mfc\\lib;C:\\Program Files\\Microsoft Visual Studio\\VC98\\lib;C:\\PROGRA~1\\SQLLIB\\LIB
Path C:\\Program Files\\SQLLIB\\java\\jdk\\bin;C:\\PROGRA~1\\SQLLIB\\BIN;C:\\PROGRA~1\\SQLLIB\\FUNCTION;

场景 1 - 使用 CLI 连接 DB2 UDB 数据库(任何平台)
可通过下载(免费)任何一个 IBM DB2 UDB 客户机来获取 DB2 UDB CLI 驱动程序(还可用作 DB2 UDB ODBC 驱动程序)。

图 1. 从 DB2 UDB for Linux、UNIX 和 Windows CLI 应用程序客户机连接到 DB2 UDB 服务器(任何平台)
从 DB2 UDB for Linux、UNIX 和 Windows CLI 应用程序客户机连接到 DB2 UDB 服务器(任意平台)

清单 1. dbconn_ODBC_CLI.c(带有最少注释且不含错误检查)


            //********************************************************************
            // SOURCE FILE NAME: dbconn_ODBC_CLI.c
            //********************************************************************
            /* Standard C/C++ Headers */
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            /* DB2 ODBC Header */
            #include <sqlcli1.h>
            /* Main Program
            */int main(int argc, char** argv)
            {
            /* Handles */
            SQLHENV  henv = SQL_NULL_HENV;
            SQLHDBC  hdbc = SQL_NULL_HDBC;
            SQLHSTMT hstmt= SQL_NULL_HSTMT;
            /* Local variables */
            SQLRETURN     rc;
            SQLCHAR       statement[32761];
            SQLCHAR       mycolout[2];
            SQLINTEGER    mycoloutlen = 0;
            char          dbname[8 + 1];
            char          user[18 + 1];
            char          pswd[30 + 1];
            if (argc < 4) {
            printf ("Usage: dbconn_ODBC_CLI <database name>
            <userid> <password>\\n");
            exit (0);
            }
            strcpy (dbname, argv[1]);
            strcpy (user,   argv[2]);
            strcpy (pswd,   argv[3]);
            rc = SQLAllocHandle(SQL_HANDLE_ENV,
            SQL_NULL_HANDLE,
            &henv);
            rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
            (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
            rc = SQLAllocHandle(SQL_HANDLE_DBC,
            henv,
            &
            hdbc);
            /* connect to the database */
            rc = SQLConnect(hdbc,
            (SQLCHAR *)dbname,
            SQL_NTS,
            (SQLCHAR *)user,
            SQL_NTS,
            (SQLCHAR *)pswd,
            SQL_NTS);
            printf ("\\n  Successful connection to '%s' db using
            ODBC/CLI \\n",dbname);
            rc = SQLAllocHandle(SQL_HANDLE_STMT,
            hdbc,
            &hstmt);
            strcpy(statement,"SELECT IBMREQD");
            strcat(statement,"  FROM SYSIBM.SYSDUMMY1;");
            rc = SQLExecDirect(hstmt,
            statement,
            SQL_NTS);
            rc = SQLBindCol(hstmt, 1,
            SQL_C_CHAR,
            mycolout,
            sizeof(mycolout),
            &mycoloutlen);
            while((rc = SQLFetch(hstmt)) == SQL_SUCCESS
            || rc == SQL_SUCCESS_WITH_INFO)
            {
            /* Print data */
            printf("  Successful retrieval of record.  Column
            'IBMREQD' has a value of '%s'\\n",mycolout);
            }
            rc = SQLCloseCursor(hstmt);
            rc = SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
            rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
            rc = SQLDisconnect(hdbc);
            printf ("  Successful Disconnection from database '%s'\\n",
            dbname);
            rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            rc = SQLFreeHandle(SQL_HANDLE_ENV, henv);
            printf ("  End of Program\\n");
            return 0;
            }  // dbconn_ODBC_CLI
            

表 2. 从 DB2 UDB for Linux、UNIX 和 Windows CLI 客户机应用程序连接到 DB2 UDB 服务器(任何平台)

Machine 1(‘myblue’)DB2 UDB for Linux、UNIX 和 Windows Machine 2(‘aries’)DB2 UDB 服务器(任何平台)
在这台机器上运行下列命令: 您需要从这台机器上获取下列信息,以便在 machine 1 上执行命令:
第一部分:配置连通性  
db2 catalog tcpip node mynode remote 9.23.190.24 server 50000
db2 catalog db sample at node mynode
db2 terminate
请参阅该系列文章的 第 1 部分以获得连通性设置的详细指导。
 
第二部分:编译并链接 CLI 程序  

在 Windows 中使用 MS Visual Studio 6:

  • cl -Zi -Od -c -W2 -DWIN32 dbconn_ODBC_CLI.c
  • link -debug -out:dbconn_ODBC_CLI.exe dbconn_ODBC_CLI.obj db2cli.lib db2api.lib

对于本文,我们将以上两个命令放置在名为‘bldappCLI.bat’的文件之中,而该文件是以程序名(不带扩展名)为参数的。

请注意,我们是使用与 odbc32.lib(ODBC 驱动程序管理器)相对的 db2cli.lib (CLI 驱动程序)来链接程序的。这意味着这是一个 CLI 程序,因而它不会通过 ODBC 驱动程序管理器;因此,该程序将仅仅对一个 DB2 UDB 数据库进行操作。

* 注意事项:

  • DB2 运行时客户机已经足够运行这个 CLI 程序了。但是,如果要像在本例中一样开发这个程序,由于需要对程序进行编译,那么您就需要 DB2 UDB 应用程序开发客户机(DB2 UDB Application Development client)。
  • 应确保已正确设置了环境变量(请参阅 表 1中的实例)。
 
第三部分:执行程序  
dbconn_ODBC_CLI sample db2admin mypsw
  • 该示例程序被设计为按此次序获取 3 个参数:<数据库名> <用户 ID> <密码>
  • ‘Sample’是此客户端机器上的 catalog db 命令中为数据库名指定的别名。默认情况下,如果没有在该命令中指定别名,那么数据库名就相当于别名。
sample = 数据库名

db2admin = 服务器上的用户 ID

mypsw = 服务器上的密码

图 2 显示了 DB2 UDB 命令‘list db directory’的输出,该命令是在用于开发程序的 Windows 系统中发出的。第一个条目‘NEW_JERS’表示一个 DB2 UDB for z/OS 数据库,第二个条目‘NORISC6’表示一个 DB2 UDB for iSeries 数据库,而最后的第三个条目‘SAMPLE’则表示一个 DB2 UDB for Linux、UNIX 和 Windows 数据库。本文中所有的示例程序将在适当的地方对这三个数据库进行操作。

图 2. List db directory 输出(系统数据库目录)
List db directory 输出(系统数据库目录)

图 3 显示了对 图 2中所示的三个数据库运行程序 db2conn_ODBC_CLI.c 时的输出。

图 3. dbconn_ODBC_CLI.c 程序输出
dbconn_ODBC_CLI.c 程序输出

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics