解决OCI_GetString2 获取中文乱码

2 篇文章 0 订阅

编码环境: WIN + VS

问题原因:工程中设置关于OCILIB字符集的宏定义存在问题

ocilib.h 中有两个宏, 一个 OCI_CHARSET_WIDE, 一个 OCI_CHARSET_ANSI;

处理汉字是, 宏定义使用 OCI_CHARSET_WIDE, 并且Lib 文件引用 如下所示:

 #if defined(OCI_CHARSET_WIDE)
      #pragma comment(lib, "ocilibw.lib")
  #elif defined(OCI_CHARSET_ANSI)
      #pragma comment(lib, "ociliba.lib")
  #endif

即数据处理这里, 对中文尽量使用UNICODE

OCI编程中,使用OCIStmtFetch2函数获取查询结果数据是正确的方式,而使用OCIParamGet函数获取表字段名则需要在OCIStmtExecute函数成功执行后才能调用。 在你的代码中,如果while循环没有进入,可能是因为OCIStmtExecute函数没有成功执行,或者查询结果没有数据。你可以在OCIStmtExecute函数执行后,通过OCIAttrGet函数获取查询结果的行数,从而判断是否有查询结果数据。 以下是一个示例代码,供你参考: ```c /* 准备SQL语句 */ const char *sql = "SELECT name, age FROM employees"; OCIStmtPrepare2(svchp, &stmtp, errhp, sql, strlen(sql), NULL, 0, OCI_NTV_SYNTAX, OCI_DEFAULT); /* 执行SQL语句 */ OCIStmtExecute(svchp, stmtp, errhp, 0, 0, NULL, NULL, OCI_DEFAULT); /* 获取查询结果的行数 */ ub4 num_rows; OCIAttrGet(stmtp, OCI_HTYPE_STMT, &num_rows, 0, OCI_ATTR_ROW_COUNT, errhp); if (num_rows > 0) { /* 获取表字段名 */ OCIParam *param; OCIParamGet(stmtp, OCI_HTYPE_STMT, errhp, (void **)&param, 1); ub4 num_cols; OCIAttrGet(param, OCI_DTYPE_PARAM, &num_cols, 0, OCI_ATTR_NUM_COLS, errhp); for (int i = 1; i <= num_cols; i++) { char col_name[64]; ub4 col_name_len; OCIParamGet(param, OCI_DTYPE_PARAM, errhp, (void **)&param, i); OCIAttrGet(param, OCI_DTYPE_PARAM, &col_name, &col_name_len, OCI_ATTR_NAME, errhp); printf("%s\t", col_name); } printf("\n"); /* 获取查询结果数据 */ while (OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT) == OCI_SUCCESS) { char name[64]; sb4 age; OCIAttrGet(stmtp, OCI_HTYPE_STMT, &name, NULL, OCI_ATTR_NAME, errhp); OCIAttrGet(stmtp, OCI_HTYPE_STMT, &age, NULL, OCI_ATTR_DATA_TYPE, errhp); printf("%s\t%d\n", name, age); } } ``` 在上面的代码中,先通过OCIAttrGet函数获取查询结果的行数,然后在num_rows大于0时,通过OCIParamGet函数获取表字段名和字段数,再通过OCIAttrGet函数获取每个字段的名称,最后使用OCIStmtFetch2函数获取查询结果数据。注意,OCIAttrGet函数获取字段名称和字段数时,要传递OCI_DTYPE_PARAM作为第二个参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值