使用unixODBC连接DB2其实也是很方便的,虽然这样没有Embeded SQL那么高效,但是可以有效解决因数据库操作代码变更带来的版本控制的烦恼。以下是unixODBC连接数据库一个简单实例。
testODBCConnectDB2.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sql.h"
#include "sqlext.h"
int main(void)
{
SQLHENV henv;//环境句柄
SQLHDBC hdbc;//连接句柄
SQLHSTMT hstmt;//语句句柄
SQLINTEGER len;
SQLCHAR szName[50];
SQLRETURN ret;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if ((ret = SQLConnect(hdbc, (SQLCHAR *)"testdb", SQL_NTS, (SQLCHAR *) "linxj", SQL_NTS, (SQLCHAR *) "123456", SQL_NTS)) == SQL_ERROR)//连接数据库
{
printf("SQLConnect Error !\n");
return(-1);
}
SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);
if ((ret = SQLExecDirect(hstmt, (SQLCHAR *) "select name from user", SQL_NTS)) == SQL_ERROR)// 执行语句
{
printf("SQLExecDirect Error !\n");
return(-2);
}
while (SQL_NO_DATA != SQLFetch(hstmt))
{
SQLGetData (hstmt, 1, SQL_C_CHAR, szName, 50, &len);//读取数据
printf("%s\n", szName);
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv); return(0);
}
makefile:
#DB2PATH为DB的安装目录
INCL = -I $(DB2PATH)/include
all: makeall \
testodbc \
clean
DEFINES = -m32 -D _LINUX_
.SUFFIXES:.c.o
.c.o:
$(CC) $(DEFINES) $(INCL) -c $*.c
objs= testODBCConnectDB2.o
makeall: $(objs)
testodbc: $(null)
gcc -o testodbc $(objs) -lncurses -lrt -lpthread -L $(DB2PATH)/lib32 -ldb2
clean:
rm -rf *.o