免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3143 | 回复: 1
打印 上一主题 下一主题

新手求助postgresql 的C api [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-08 15:49 |只看该作者 |倒序浏览
本帖最后由 umyspl 于 2010-09-08 15:51 编辑

这是查询
  1. bool CPqRecordset::Each(uint32_t nRows, uint32_t nCol, void *value, SQL_RET_TYPE _type)const
  2. {
  3.         if(status != IRS_ERR_OK)return false;
  4.         char * tmp = PQgetvalue(pPQrlt,nRows,nCol);
  5.         switch(_type)
  6.         {
  7.         case SQL_RET_INT8:
  8.         case SQL_RET_UINT8:
  9.                 memcpy(value,(void*)tmp,sizeof(uint8_t));
  10.                 return true;
  11.         case SQL_RET_UINT16:
  12.         case SQL_RET_INT16:
  13.                 memcpy(value,(void*)tmp,sizeof(uint16_t));
  14.                 return true;
  15.         case SQL_RET_INT32:
  16.         case SQL_RET_UINT32:
  17.                 memcpy(value,(void*)tmp,sizeof(uint32_t));
  18.                 return true;
  19.         case SQL_RET_INT64:
  20.         case SQL_RET_UINT64:
  21.                 memcpy(value,(void*)tmp,sizeof(uint64_t));
  22.                 return true;
  23.         case SQL_RET_DOUBLE:
  24.                 memcpy(value,(void*)tmp,sizeof(double));
  25.                 return true;
  26.         case SQL_RET_FLOAT:
  27.                 memcpy(value,(void*)tmp,sizeof(float));
  28.                 return true;
  29.         case SQL_RET_PPCHAR:
  30.                 *((void**)value) = (void*)tmp;
  31.                 return true;
  32.         default:return false;
  33.         }
  34. }
复制代码
测试代码
  1. uint64_t user_id;
  2.         char * user_name,*user_phone;

  3.         cpqrs.Each(0, 0, &user_id,           SQL_RET_UINT64);
  4.         cpqrs.Each(0, 1, (void*)&user_name,  SQL_RET_PPCHAR);
  5.         cpqrs.Each(0, 2, (void*)&user_phone, SQL_RET_PPCHAR);
  6.         std::cout<<"\n------------------------------------------------------\n";
  7.         std::cout<<"-----uid:"<<user_id<<std::endl;
  8.         std::cout<<"---uname:"<<user_name<<std::endl;
  9.         std::cout<<"userphone:"<<user_phone<<std::endl;

  10.         InitRowAr(line_0,3);
  11.         std::cout<<"userId:"<<GetRowInt64(line_0,0)<<std::endl;
复制代码
结果
  1. /** CDatabase Test Begin -----------------------------------------------------------**/
  2. PgDB->Query

  3. ------------------------------------------------------
  4. -----uid:14133329480791089
  5. ---uname:Virus
  6. userphone:13813813838
  7. userId:3055692486422439423
  8. -------------------------------------
复制代码
现在的问题是字符串都读对了。但是那个64位的bigint型的数值不对。什么地方有错么。
这边没经过什么处理。只有指针和指针类型强转。
memcpy之前我printf过了,结果跟那个:14133329480791089一样的。
  1. 1423062;"Virus";"13813813838    ";"123456                          ";0;9;0;1273644186;0;0;1;0;"''"
复制代码
这个是原数据。
那个uid应该==1423062

请熟悉的人指导下。谢谢。

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
2 [报告]
发表于 2010-09-08 16:24 |只看该作者
好吧。知道了。原来是字符串形式的。不是二进制整数。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP