我所写的程序的步骤大致如下(程序有点长,用文字代替),出现的错误是运行了一段时间后就停止了运行。一般是读了十几个txt文件后程序就停在下方提示处。好像是引起了表的锁的机制(是不是我OCI的程序的设计问题导致的),请问怎么才能解除这种错误。或者我OCI的结构有问题还是什么的。 do
{
if("文件夹中的文件不是系统文件")
{
读取txt文件名称
申请环境句柄
申请服务器句柄
申请错误句柄
申请用户会话句柄
申请服务上下文句柄
申请语句句柄
申请结合句柄
使用线程和对象模式来创建环境句柄OCIEnvCreate
分配服务器句柄OCIHandleAlloc
分配错误句柄OCIHandleAlloc
创建服务器上下文句柄,“LE”为建立连接的数据库名OCIServerAttach
分配服务器上下文句柄OCIHandleAlloc
设置服务器上下文句柄的服务器句柄属性OCIAttrSet
分配用户会话句柄OCIHandleAlloc
为用户会话句柄设置用户名和密码属性OCIAttrSet
                                  OCIAttrSet
OCISessionBegin
在服务器上下文环境中设置用户会话属性OCIAttrSet
分配语句句柄OCIHandleAlloc
准备SQL语句OCIStmtPrepare
由位置绑定OCIBindByPos
fp=fopen(txt文件,"r");while(条件满足)
{
读取文件内数据,并赋给相关变量
[b]执行插入数据操作OCIStmtExecute[/b]****************************程序停止处
读完退出(每个txt文件中大概有12000组数据,所以上面插入操作要执行12000次)
}提交OCITransCommit
fclose(fp);
结束会话OCISessionEnd
断开连接OCIServerDetach
释放句柄OCIHandleFree
}
}while("文件夹中还有文件(文件夹中大概有200个文件)")

解决方案 »

  1.   

    while(条件满足) 

    读取文件内数据,并赋给相关变量 
    执行插入数据操作OCIStmtExecute****************************程序停止处 
    读完退出(每个txt文件中大概有12000组数据,所以上面插入操作要执行12000次) 

    ================
    在循环里面分批提交,不要循环完成后再提交,那么需要的内存太大了
    有可能是服务器内存不够而产生锁或死机建议你在循环里每有500条INSERT语句时提交一次;
      

  2.   

    先按楼上说的去测试一下,如果还出问题,你把那个SQL语句及表结构帖来看看。
    还有,做这么大的操作,回滚段应该适当加大。
      

  3.   

    SQL语句为:"INSERT INTO LE.TLEDA(T_INUM,T_ECLA,T_IDES,T_ESEP,T_STDE,T_NDDE,T_DRAG,T_ETYP,T_ENUM,T_CSUM,T_OINC,T_RAAN,T_ECCE,T_AROP,T_MEAN,T_MMOT,T_RNAE,T_CKUM) VALUES(:num1,:num2,:num3,:num4,:num5,:num6,:num7,:num8,:num9,:num10,:num11,:num12,:num13,:num14,:num15,:num16,:num17,:num18)";
    表的结构为:
    名称 数据类型 大小 小数位
    T_INUM NUMBER 10 0
    T_ECLA VARCHAR2 1
    T_IDES VARCHAR2 8
    T_ESEP NUMBER  13 8
    T_STDE VARCHAR2 10
    T_NDDE VARCHAR2 8
    T_DRAG VARCHAR2 8
    T_ETYP NUMBER  1 0
    T_ENUM NUMBER  4 0
    T_CSUM NUMBER  1 0
    T_OINC NUMBER  8 4
    T_RAAN NUMBER  8 4
    T_ECCE NUMBER  7 0
    T_AROP NUMBER  8 4
    T_MEAN NUMBER  10 8
    T_MMOT NUMBER  10 8
    T_RNAE NUMBER  5 0
    T_CKUM NUMBER  1 0