我通过VC使用OCI接口向oracle数据库里插入数据。插入语句为INSERT 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.为什么老是提示插入的值对于列过大。string类型的数据和varchar2之间有什么区别和联系吗。我应该吧表中字段的长度设为多少才不回出错?或者有相关方面的文章吗?谢谢各位赐教!

解决方案 »

  1.   

    ALTER TABLE sys.tle1 MODIFY (T_INUM varchar2(20),T_ECLA varchar2(20),T_IDES varchar2(20));
    觉得太大了后,再回缩一下。
      

  2.   

    是不是在预处理insert语句的时候,添加了空格、换行之类的东西用个函数去空格trim(C#)建议:出错的代码前添加类似 lengthb('你的出错的数据')的调试代码,把在实际插入前的确切长度得到,看是否真的是超出了列限制。
    。  
    INSERT INTO SYS.TLE1(T_INUM,T_ECLA,T_IDES) VALUES(:sub1,:sub2,:sub3); 
    这个句子替换成
    INSERT INTO SYS.TLE1(T_INUM,T_ECLA,T_IDES) VALUES('5','1','8');
    到数据库查询分析器里执行一下。如果么有错那么很有可能是外面传参错误
      

  3.   

    我的sub1到sub3的数据类型都是在C++里面通过using namespace std;来定义的string的字符串类型。是不是这个原因。两者有什么关系吗?
      

  4.   

    是否存在中文字符串? 用lengthb试试看。
      

  5.   

    我在程序里加了一个sizeof(sub1)的句子,得出的结果都是16,每个变量求sizeof后结果都是16.我把表中数据的长度改成17就能添加,可是添加的都是乱码。请问是怎么回事啊?
      

  6.   

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