oracle - oracle OCI 获取数据有空白字符
问题描述
OCI从oracle数据库中取数据,数据字段有问题(其实没问题),例如:如果我的表是这样定义的:
create table t_test (
text_field varchar2(35),
....
);
如果我使用缓冲区来检索从 oracle 数据库中获取的数据字段,oci 会自动添加一些空白字符,这里有一些获取代码:
void SingleFetch_Test()
{
ROCIDataSet oci_dataset={0};
char query_clause[1024]= "select distributorcode,senddirectory from t_exppath order by distributorcode";
char exp_code[15]="";
char exp_path[256]="";
sword retcode=0;
SetDataSetClause(&oci_dataset,query_clause);//OCIStmtPrepare
//Prepare->OCIDefineByPos->OCIStmtExecute...
ub2 dbtype;
retcode=OpenOCIDataSet(&oci_dataset);//OCIStmtExecute
{
OCIParam *param;
ub4 index=1;
ub2 type,type_length;
text* column_name;
ub4 col_name_len;
int col_count=0;
OCIAttrGet(oci_dataset.stmt,OCI_HTYPE_STMT,(void*)&col_count,(ub4*)0,(ub4)OCI_ATTR_PARAM_COUNT,oci_dataset.err);
printf("count:%d columns\n",col_count);
while(OCI_SUCCESS==OCIParamGet(oci_dataset.stmt,OCI_HTYPE_STMT,oci_dataset.err,(void**)¶m,index)) {
OCIAttrGet((void*)param,
(ub4)OCI_DTYPE_PARAM,
(void**)&column_name,
(ub4*)&col_name_len,
(ub4)OCI_ATTR_NAME,
oci_dataset.err);
OCIAttrGet((void*)param,
(ub4)OCI_DTYPE_PARAM,
(void*)&type,
(ub4*)0,
(ub4)OCI_ATTR_DATA_TYPE,
oci_dataset.err);
OCIAttrGet((void*)param,
(ub4)OCI_DTYPE_PARAM,
(void*)&type_length,
(ub4*)0,
(ub4)OCI_ATTR_DATA_SIZE,
oci_dataset.err);
//OCI_ATTR_PRECISION
//OCI_ATTR_SCALE
//OCI_ATTR_IS_NULL
printf("%s:(%s,%d)\n",column_name,(type==OCI_TYPECODE_VARCHAR2?"characters":"other"),type_length);
index++;
}
}
OCIDefine* pdef=(OCIDefine*)0;
dbtype=SQLT_CHR;//SQLT_STR;
OCIDefineByPos(oci_dataset.stmt,&pdef,oci_dataset.err,1,(dvoid*)exp_code,(sword)sizeof(exp_code),dbtype,(dvoid*)0,(ub2*)0,(ub2*)0,OCI_DEFAULT);
dbtype=SQLT_CHR;//SQLT_STR;
OCIDefineByPos(oci_dataset.stmt,&pdef,oci_dataset.err,2,(dvoid*)exp_path,(sword)sizeof(exp_path),dbtype,(dvoid*)0,(ub2*)0,(ub2*)0,OCI_DEFAULT);
while(TRUE) {
if(retcode==OCI_NO_DATA) {
break;
}
else if(retcode==OCI_SUCCESS||retcode==OCI_SUCCESS_WITH_INFO) {
printf("[%s],[%s]\n",exp_code,exp_path);
memset(exp_code,0x00,sizeof(exp_code));
memset(exp_path,0x00,sizeof(exp_path));
retcode=OCIStmtFetch(oci_dataset.stmt,oci_dataset.err,1,OCI_FETCH_NEXT, OCI_DEFAULT);
}
else {
GetOCIDataSetError(&oci_dataset);
printf("%s\n",oci_dataset.error_desc);
break;
}
}
CloseOCIDataSet(&oci_dataset);
}
和表格定义:
create table T_EXPPATH
(
distributorcode VARCHAR2(3) not null,
distributorname VARCHAR2(80),
senddirectory VARCHAR2(120)
)
和输出:
[999 ],[F:\data\TestFolder\ ]
我希望:[999],[F:\data\TestFolder]
如果有数字数据字段,我可以使用 oci api 将其转换为文本缓冲区,并且右侧也填充了一些空白字符。如果我使用一些内存缓冲区来缓存获取结果。空白字符没有什么好处,但会消耗内存大小。有没有办法处理这个空白字符?
解决方案
推荐阅读
- python - 保留 JSON obj 中的某些值,使其结构更深
- python - 检查 2D numpy 数组中的每个元素是否都在集合中
- .net - 将带有 OdbcConnection 的 .Net/C# 项目迁移到带有 Informix DB 的 SqlConnection
- python-3.x - DRF 标注作者有书的所有店铺
- python - 有没有一种巧妙的方法可以从这个字符串列表中提取日期,其中一些字符串没有日期模式?
- angular - 带有远程 URL 的 SimpleLightbox
- arrays - 将文件中的多种数据类型扫描到c中的一个数组中
- sequence - 考虑整数溢出的重新排序序列
- angular - Angular 12 http请求返回未定义的参数
- angular - 为使用 routerLink、Spectator 和 Jest 的 Angular 组件编写测试时出现“TypeError:将循环结构转换为 JSON”错误