注册
ODBC连接DM8的连接串中添加自定义参数
技术分享/ 文章详情 /

ODBC连接DM8的连接串中添加自定义参数

卖女孩的小废柴 2023/03/20 2045 2 0

一、说明

  1. 在ODBC中连接到数据源的常用方法有SQLConnect函数与SQLDriverConnect函数两种
  2. 当使用SQLConnect函数连接数据库时,手册中未说明该方法如何添加连接串属性。经测试是在odbc.ini使用LINK_ATTR=COMPATIBLE_MODE=ORACLE
  3. 本文会说明ODBC中如何使用SQLDriverConnect以及SQLConnect函数添加方式以及完整的测试用例

二、SQLDriverConnect连接方式

C代码

SQLCHAR szConnStrOut[256]; SQLSMALLINT cbConnStrOut; sret = SQLDriverConnect(hdbc, NULL, (SQLCHAR *)("SERVER=127.0.0.1;DSN=DM8;DRIVER=DM8 ODBC DRIVER;UID=SYSDBA;PWD=SYSDBA;TCP_PORT=5236;COMPATIBLE_MODE=ORACLE"), SQL_NTS, szConnStrOut, 256,&cbConnStrOut, SQL_DRIVER_NOPROMPT);

三、SQLConnect连接方式

1. C代码

sret = SQLConnect(hdbc, "DM8", SQL_NTS, "SYSDBA", SQL_NTS, "SYSDBA", SQL_NTS);

2. odbc.ini中添加兼容参数

[root@localhost bin]# cat /usr/local/unixODBC-arm/etc/odbc.ini [DM8] DRIVER=DM8 ODBC DRIVER SERVER=127.0.0.1 UID=SYSDBA PWD=SYSDBA TCP_PORT=5236 LINK_ATTR=COMPATIBLE_MODE=ORACLE

3. odbcinst.ini的文件配置

[root@localhost bin]# cat /usr/local/unixODBC-arm/etc/odbcinst.ini [DM8 ODBC DRIVER] Description=DM ODBC driver for DM8 Driver=/opt/dmdbms_20230316/bin/libdodbc.so

四、完整用例

1. 用例的Sql语句

CREATE TABLE "OTC_BIZ_INVESTOR_INST_TYPE" ( "INVESTOR_BIZ_ID" INTEGER, "INST_CLS" CHAR(2), "INST_CLSS" VARCHAR2(50)); insert into "OTC_BIZ_INVESTOR_INST_TYPE" ("INVESTOR_BIZ_ID","INST_CLS","INST_CLSS") values (1, '@ ', '123456@qq.com');

2. C代码_odbc_query_char.c

#include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqltypes.h> #include <sqlext.h> #include <unistd.h> #include <time.h> /* 检测返回代码是否为成功标志,当为成功标志返回 TRUE,否则返回 FALSE */ #define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO) /* 检测返回代码是否为失败标志,当为失败标志返回 TRUE,否则返回 FALSE */ #define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc))) HENV henv;/* 环境句柄 */ HDBC hdbc;/* 连接句柄 */ HSTMT hstmt;/* 语句句柄 */ SQLRETURN sret; /* 返回代码 */ SQLSMALLINT col, cols; int main(void) { /* 申请一个环境句柄 */ SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); /* 设置环境句柄的 ODBC 版本 */ SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); /* 申请一个连接句柄 */ SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); clock_t start, end; // char connStr[1024]; sret = SQLConnect(hdbc, "DM8", SQL_NTS, "SYSDBA", SQL_NTS, "SYSDBA", SQL_NTS); SQLCHAR szConnStrOut[256]; SQLSMALLINT cbConnStrOut; // SQLDriverConnect函数的添加兼容参数方式 // sret = SQLDriverConnect(hdbc, NULL, (SQLCHAR *)("SERVER=127.0.0.1;DSN=DM8;DRIVER=DM8 ODBC DRIVER;UID=SYSDBA;PWD=SYSDBA;TCP_PORT=5236;COMPATIBLE_MODE=ORACLE"), SQL_NTS, szConnStrOut, 256,&cbConnStrOut, SQL_DRIVER_NOPROMPT); if (RC_NOTSUCCESSFUL(sret)) { /* 连接数据源失败! */ printf("odbc: fail to connect to server!,result %d\n",sret); // 连接失败,获取错误信息 SQLCHAR state[6]; SQLINTEGER error_code; SQLCHAR message[SQL_MAX_MESSAGE_LENGTH]; SQLSMALLINT message_length; SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, state, &error_code, message, SQL_MAX_MESSAGE_LENGTH, &message_length); printf("Failed to connect to database: %s\n", message); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); exit(0); } printf("odbc: connect to server success!\n"); SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); //配置绑定语句 SQLCHAR query[512] = "select INVESTOR_BIZ_ID,INST_CLSS from OTC_BIZ_INVESTOR_INST_TYPE where INSTR(INST_CLSS, ?) > 0"; SQLINTEGER id = 1; char szInstClsCond[2 + 1] = {0}; szInstClsCond[0] = '@'; sret = SQLPrepare(hstmt, query, SQL_NTS); SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(szInstClsCond) - 1, 0, szInstClsCond, 0, NULL); SQLExecute(hstmt); int out_c1 = 0; SQLCHAR out_c2[20] = { 0 }; SQLLEN out_c1_ind = 0; SQLLEN out_c2_ind = 0; SQLBindCol(hstmt, 1, SQL_C_SLONG, &out_c1, sizeof(out_c1), &out_c1_ind); SQLBindCol(hstmt, 2, SQL_C_CHAR, &out_c2, sizeof(out_c2), &out_c2_ind); printf("odbc: select from table...\n"); while (SQLFetch(hstmt) != SQL_NO_DATA) { printf("INVESTOR_BIZ_ID = %d, INST_CLSS = %s ,\n", out_c1, out_c2); } printf("odbc: select success\n"); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); /* 断开与数据源之间的连接 */ SQLDisconnect(hdbc); /* 释放连接句柄 */ SQLFreeHandle(SQL_HANDLE_DBC, hdbc); /* 释放环境句柄 */ SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }

3. 编译运行程序

编译运行odbc_query_char.c [root@localhost bin]# gcc -o odbc_query_char odbc_query_char.c -I /opt/dmdbms_1_2_198_test/include -I /usr/local/unixODBC-arm/include -L /opt/dmdbms_1_2_198_test/bin -L /opt/dmdbms_1_2_198_test/drivers/odbc -DDM64 -ldodbc
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服