当使用批处理入库的时候,使用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 );
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 );
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
我的希望在一次性入库100条记录时,如果有两条失败了,其他98条还能入库。最后记录下错误的记录条数就可以了。但是按照理论上的方法却不行 。OCIStmtExecute(m_svchp, m_stmthp, m_errhp,100, 0,0,0, OCI_BATCH_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);// 重新提交正确的记录数
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 );