当使用批处理入库的时候,使用OCI_BATCH_ERRORS模式,如果100条记录里面有2条失败,按理说其他正确的记录会入库的,为什么我的不能正确入库呢?OCI_ATTR_NUM_DML_ERRORS 可以正确取得记录条数。代码如下:result = OCIStmtExecute(m_svchp, m_stmthp, m_errhp,100, 0,0,0, OCI_BATCH_ERRORS);
OCI_Check_Error(m_errhp, result, _szError);

long countErrors = 0;
result = OCIAttrGet(m_stmthp, OCI_HTYPE_STMT, &countErrors, 0, OCI_ATTR_NUM_DML_ERRORS, m_errhp);result = OCITransCommit(m_svchp, m_errhp, (ub4)OCI_DEFAULT );

解决方案 »

  1.   

    OCI_BATCH_ERRORS模式?是啥子东西哦?
      

  2.   

    OCI_BATCH_ERRORS模式 就是在批处理的时候,如果某一条记录失败了,它会继续入库剩下的纪录.最后记录下错误的记录. 如果是OCI_DEFAULT模式,在批处理的时候只要有一条记录入库失败,剩下的记录就不入库.函数立即返回.执行SQL语句 
    sword OCIStmtExecute ( 
    OCISvcCtx           *svchp,  //服务环境句柄 
                          OCIStmt             *stmtp,  //语句句柄 
                          OCIError            *errhp, 
                          ub4                 iters, // ** 
                          ub4                 rowoff, //** 
                          CONST OCISnapshot   *snap_in, 
                          OCISnapshot         *snap_out, 
                          ub4                 mode //** 
    ); 
    **注: 
    1. iters:对于select语句,它说明一次执行读取到buffer中的记录行数,如果不能确定select语句所返回的行数,可将iters设置为0,而对于其他的语句,iters表示这些语句的执行次数,此时iters不能为0。 
    2. rowoff:在多行执行时,该参数表示从所结合的数据变量中的第几条记录开始执行(即记录偏移量)。 
    3. mode:=OCI_DEFAULT:default模式 
    =OCI_DESCRIBE_ONLY:描述模式,只返回选择列表的描述信息,而不执行语句 
    =OCI_COMMIT_ON_SUCCESS:自动提交模式,当执行成功后,自动提交。 
    =OCI_EXACT_FETCH:精确提取模式。 
    =OCI_BATCH_ERRORS:批错误执行模式:用于执行数组方式的操作,在此模式下,批量insert ,update,delete时,执行过程中任何一条记录错误不会导致整个insert ,update,delete失败,系统自动会收集错误信息,而在非批错误方式下,其中的任何一条记录错误,将会导致整个操作失败。 
    相关连接参考: http://topic.csdn.net/u/20101014/17/ceba0027-4404-4d59-9915-67cca5b072cf.html
      

  3.   

    up大家在批处理的时候,遇到错误都是怎么样处理的?
    我的希望在一次性入库100条记录时,如果有两条失败了,其他98条还能入库。最后记录下错误的记录条数就可以了。但是按照理论上的方法却不行 。OCIStmtExecute(m_svchp, m_stmthp, m_errhp,100, 0,0,0, OCI_BATCH_ERRORS);不解,不解。 请那位高手能帮忙解决下,不胜感激~~ 急~~~
      

  4.   

    终于让我解决了。
    当有错误发生时,我们需要重新提交下成功的记录!!!
    result = OCIStmtExecute(m_svchp, m_stmthp, m_errhp,100, 0,0,0, OCI_BATCH_ERRORS);
    OCI_Check_Error(m_errhp, result, _szError);long countErrors = 0;
    result = OCIAttrGet(m_stmthp, OCI_HTYPE_STMT, &countErrors, 0, OCI_ATTR_NUM_DML_ERRORS, m_errhp);// 重新提交正确的记录数
    int iSuccessNum = 100 - countError;
    if(iSuccessNum > 0 && countError!=0)
       result = OCIStmtExecute(m_svchp, m_stmthp, m_errhp,iSuccessNum , 0,0,0, OCI_BATCH_ERRORS);
    result = OCITransCommit(m_svchp, m_errhp, (ub4)OCI_DEFAULT );