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);
sret = SQLConnect(hdbc, "DM8", SQL_NTS, "SYSDBA", SQL_NTS, "SYSDBA", SQL_NTS);
[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
[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
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');
#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;
}
编译运行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
文章
阅读量
获赞