我在VC++里通过oci向oracle插入数据。所插入的数据类型是在VC++里通过“using namespace std”定义的是string类型,sql语句是INTO SYS.TLE1(T_INUM,T_ECLA,T_IDES) VALUES(:sub1,:sub2,:sub3);sub1到sub3都是string类型数据,oracle表中的字段数据类型为varchar2,sub1的长度为5,sub2的长度为1,sub3的长度为8;表中对应字段的长度分别也是5,1,8。
  其中,sub1的长度用sizeof求的话是16,用sub1.length()求的话是5,请问两者有什么不同。为什么插入到数据库里后显示的是乱码?请赐教。谢谢了。

解决方案 »

  1.   

    在sql中试一下两者间的差别:select lengthb('test汉字字符') from dual;
    select length('test汉字字符') from dual;汉字字符是占两位的,使用lengthB再试一下。
      

  2.   

    我的数据里面没有汉字。数据就是比如“21345”,或者"56213ABC",或者“+1.45678”等。
      

  3.   

    我把要插入的数据定义成char num1[6]={"12345"}(此时表中字段(类型是varchar2)的长度为6)的话就可以插入进去,可是插入到数据库的数据后面还包含着一个小方块,估计是num1后的‘\0’;可我把数据定义成string num1=“12345”后,表的字段必须是16以上,要不然会提示插入值对于列过大;改为16后,可以插入,可是插入的都是乱码。不知是为何?
      

  4.   

    char num1[17] = {"12345"}; //不建议用std::stringr = OCIBindByPos( Stmthp1, &pBndhp, pFErrorhp, (ub4)1,
                  (dvoid *)num1, (sword)17, SQLT_STR,
                  (dvoid *)&ind1, (ub2 *)0, (ub2 *)0,
                  (ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);建议详细琢磨OCIDefineByPos()和OCIBindByName()的各种参数含义 另外,建议lz去8i、9i的安装目录看oracle提供的demo,本人就是通过demo熟悉OCI的。
      

  5.   

    问题解决了。
    首先还是不能用std:string;
    再者,用char num1[17]定义后,用OCIBindbypos时,后面的类型参数要用SQLT_STR,而不是SQLT_CHR.就搞定了。
    谢谢大家了。
    谢谢sailing0123 。
      

  6.   

    问题解决了。
    首先还是不能用std:string;
    再者,用char num1[17]定义后,用OCIBindbypos时,后面的类型参数要用SQLT_STR,而不是SQLT_CHR.就搞定了。
    谢谢大家了。
    谢谢sailing0123 。