Chinaunix首页 | 论坛 | 博客
  • 博客访问: 831588
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: DB2/Informix

2023-11-12 00:25:57

db2 真的是别具一格,c语言直接访问 db2 数据库吧,得必须指定数据表名,编译的时候还得用 bind 进行绑定,并且把生成的绑定文件一起发布,遇到环境发生改变的时候,原来编译的程序,还得二次绑定和编译。使用 unixODBC 虽然可以避免这个问题吧,它的 odbc 配置居然和其他的不一样,奇葩了。

过程记录下一下,别忘记了。

首先配置 odbc 的访问:
在当前用户的主目录下,配置三个文件,分别是 .odbc.ini ,  .odbcinst.ini , .db2cli.ini , 内容如下:

.odbcinst.ini 文件

点击(此处)折叠或打开

  1. [PostgreSQL]
  2. Description = ODBC for PostgreSQL
  3. Driver = /usr/lib/psqlodbc.so
  4. Setup = /usr/lib/libodbcpsqlS.so
  5. Driver64 = /usr/lib64/psqlodbc.so
  6. Setup64 = /usr/lib64/libodbcpsqlS.so
  7. FileUsage = 1
  8. [MySQL]
  9. Description = ODBC for MySQL
  10. Driver = /usr/lib/libmyodbc5.so
  11. Setup = /usr/lib/libodbcmyS.so
  12. Driver64 = /usr/lib64/libmyodbc5.so
  13. Setup64 = /usr/lib64/libodbcmyS.so
  14. FileUsage = 1
  15. [ODBC]
  16. Trace = yes
  17. Tracefile = /tmp/odbc.log
  18. [DB2]
  19. Description = DB2
  20. Driver = /opt/ibm/db2/V11.1/lib32/libdb2.so
  21. Driver64 = /opt/ibm/db2/V11.1/lib64/libdb2o.so
  22. FileUsage = 1
这里面,别的就不说明了,只说明重点看 DB2 的配置部分。

.odbc.ini 文件

点击(此处)折叠或打开

  1. [ODBC Data Sources]
  2. dbschema = db2inst1
  3. [sample]
  4. Description = Sample
  5. Driver = DB2
这里重点看 sample 段,这个部分我为了简单,和我在安装数据库的时候,利用 db2sample 生成的示例库采用了同一个名字。这个名字是可以修改的,你可以随意起一个名字,但是这个名字要与你下面在 .db2cli.ini 文件中定义的对应内容保持一致。

.db2cli.ini 文件

点击(此处)折叠或打开

  1. [sample]
  2. hostname ="192.168.137.202"
  3. pwd ="db2inst1"
  4. port ="50000"
  5. PROTOCOL =TCPIP
  6. database ="sample"
  7. uid ="db2inst1"

这里面的节点名 sample 和上面的 .odbc.ini 中的节点名字要保持一致。
特别注意说明的,db2 的 odbc 驱动参数,必须采用如下的方式进行配置,否则在下面的测试代码中,会造成连接数据库失败。

下面是我用 c 语言编写的通过 unixODBC 访问 DB2 数据库的示例代码。

testODBCConnectDB2.c

点击(此处)折叠或打开

  1. //testODBCConnectDB2.c;

  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>

  5. #include "sql.h"
  6. #include "sqlcli.h"
  7. #include "sqlext.h"

  8. int main(void)
  9. {
  10.     SQLHENV henv;//环境句柄
  11.     SQLHDBC hdbc;//连接句柄
  12.     SQLHSTMT hstmt;//语句句柄
  13.     SQLINTEGER len;
  14.     SQLCHAR szName[50];
  15.     SQLRETURN ret;
  16.     SQLSMALLINT     columns;

  17.     int         i = 0;


  18.     ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  19.     ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
  20.     ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

  21.     if ((ret = SQLConnect(hdbc, (SQLCHAR *)"sample", SQL_NTS, (SQLCHAR *) "db2inst1", SQL_NTS, (SQLCHAR *) "db2inst1", SQL_NTS)) == SQL_ERROR)//连接数据库
  22.         {
  23.                 printf("SQLConnect Error !\n");
  24.                 return(-1);
  25.         }

  26.         SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);

  27.         if ((ret = SQLExecDirect(hstmt, (SQLCHAR *) "select * from VPROJ", SQL_NTS)) == SQL_ERROR)// 执行语句
  28.         {
  29.                 printf("SQLExecDirect Error !\n");
  30.                 return(-2);
  31.         }
  32.     SQLNumResultCols(hstmt, &columns);  // 获取每行的列数
  33.         while (SQL_NO_DATA != SQLFetch(hstmt))
  34.         {
  35.         for ( i = 0 ; i <= columns ; i++ )
  36.         {
  37.             bzero(szName,50);
  38.      SQLGetData (hstmt, i, SQL_C_CHAR, szName, 50, &len);//读取数据
  39.             if ( i == 0 )
  40.                         printf("%s ", szName);
  41.             else
  42.                         printf("| %s ", szName);
  43.                 
  44.             if ( i == columns )
  45.                 printf("\n");
  46.         }
  47.         }

  48.         SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
  49.         SQLDisconnect(hdbc);
  50.         SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
  51.         SQLFreeHandle(SQL_HANDLE_ENV, henv); return(0);
  52. }
这个代码是我拿别人的代码进行修改的,原代码在编译的时候没有通过,我进行了小改动。
改动的地方不重要,重要的说明是如下语句:

点击(此处)折叠或打开

  1. if ((ret = SQLConnect(hdbc, (SQLCHAR *)"sample", SQL_NTS, (SQLCHAR *) "db2inst1", SQL_NTS, (SQLCHAR *) "db2inst1", SQL_NTS)) == SQL_ERROR)//连接数据库
注意这个中间的 sample , 这个是服务名,也就是你的 .odbc.ini 和 .db2cli.ini 中配置的数据源的节点名称。

{BANNED}中国第一个 db2inst1 是访问 db2 数据库的用户名,也就是在 .db2cli.ini 中配置的 uid , 第二个 db2inst1 是访问 db2 数据库的用户的密码,也就是在 .db2cli.ini 中配置的 pwd 。

其他地方没有要说明的了。

Makefile 文件:

点击(此处)折叠或打开

  1. #makefile:
  2. #DB2PATH为DB的安装目录
  3. DB2PATH=/opt/ibm/db2/V11.1
  4. INCL = -I $(DB2PATH)/include -I. -I $(HOME)/source_code/include
  5. all: testodbc
  6. DEFINES = -m64 -D _LINUX_
  7. .SUFFIXES:.c.o
  8. .c.o:
  9. $(CC) $(DEFINES) $(INCL) -c $*.c
  10. objs= testODBCConnectDB2.o
  11. testodbc: $(objs)
  12. gcc -o testodbc $(objs) -lncurses -lrt -lpthread -L $(DB2PATH)/lib64 -ldb2
  13. clean:
  14. rm -rf *.o testodbc

仅作为记录吧 。 

补充说明一下:
当前用户的 .bashrc 文件中,必须添加如下语句,否则会造成 odbc 访问 db2 数据库失败。

if [ -f /home/db2inst1/sqllib/db2profile ]; then
    . /home/db2inst1/sqllib/db2profile
fi



 
阅读(207) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~