我在vc中向oracle中A表插入数据,同时在vc中定时触发触发器,
触发器在后台对A表部分字段进行更新操作。
单程序运行一段时间后,就会出现异常,如果把触发器disable掉,
程序就会正常运行了。
所以我认为是程序一方面向A表写数据,另一方面触发器对A表更新数据,
造成这种原因。
我是新手,不知道这个问题怎么来解决!
请各位大哥帮我出出注意!
谢谢!

解决方案 »

  1.   

    我用的就是数据库的触发器啊,只不过在vc中的ontimer消息响应函数中用ado的update触发另外我的异常是在运行中不定时出现的,单步或按断点很难跟到不知如何是好!谢谢你!
      

  2.   

    请利用Oracle的锁机制,在插入、删除、更新的时候加锁
      

  3.   

    你的是before trigger还是after trigger?oracle跟sqlserver不一样,触发器里是不允许update本表的
      

  4.   

    理论上你的做法是不会出现问题的。
    应该是你的vc和oracle的触发器互相出现了一个类似循环操作的现象。估计是你的触发器写的有问题。没有处理好并发的关系。
      

  5.   

    我并不是对本表进行更新啊!用的是after 触发
    谢谢!
      

  6.   

    我想了个办法,不知行不?就是在定时器中createthread创建线程在线程中执行触发语句ado_recordset.execute("update .....")之前,把当前数据库的记录都导入到另一个表B,这样修改一下触发器对B更新,虽然效率会降低一些,但是也许可行啊?
      

  7.   

    我下午改为线程,还是有异常!把ontimer时间改短一些,异常代码是这样的
    kernel32! 7c812a56()
    msvcrtd!_cxxthrowexception@8+57bytes
    _com_raise_error(long -2147217871,
    IErrorInfo *0x01053950)+35bytes
    _com_issue_errorex(long -2147217871,I unknown * 0x01037a08,const_guid&{11D_connection15})+93bytes
    connection15::execute(_bstr_t{"update message_sis set ns_flag=1"(1)}tagVARIANT * 0x00000000{???},long 1) line344
    updateMessage(voud*0x00000000)update message_sis set ns_flag=1是我那条sql语句,执行时就会出异常
    updateMessage是我线程名!
      

  8.   

    对话框提示是:
    kernel32.dll
    0xe06d7363
      

  9.   

    在最后面加上FOR UPDATE还有,贴出你的表结构,约束,触发器,和错误代码
      

  10.   

    谢谢大家,问题解决了。
    是ado对象默认的超时时间的问题造成的,
    把时间改长一点就好了,
    只可惜vc连这种问题都不能有效的告知程序员。
    谢谢大家!