现对一表进行如下操作,主键为ID
1.定义并启动一个事务
2.使用com智能指针打开表
_RecordsetPtr pRecPtr = m_pAdoDb->OpenTable(strSQL,adCmdText);//m_pAdoDb为数据库连接指针
3.添加记录
spRcdset->AddNew();
4.写入部分字段,然后Update
spRcdset->Update(vtMissing, vtMissing);问题在于,如果上述操作使用SQL SERVER完成(ID为自增列),在第4步操作之后我可以用
_variant_t Value = spRcdset->GetCollect(L"ID");
来获取新插入的记录的ID
如果使用Oracle操作,在在第4步操作之后使用
_variant_t Value = spRcdset->GetCollect(L"ID");
却无法获得新插入的记录的ID。
请问这是问什么?在获取到ID之后结束事务。

解决方案 »

  1.   

    oracle 没有自增的序列。
    办法有2个:
      1.自己取得oracle序列的下一值.
      2.触发器
      

  2.   

    在这个问题中,SQL SERVER已使用自增列,而Oracle已使用序列加触发器。
      

  3.   

    仔细看了描述:既然已经提交数据库了,并且程序没有报错(因为id是主键),表明数据已经存入数据库.认为有必要检查一下程序,或者查看数据库是否真的有你提交的数据.(不懂"使用com智能指针打开表")
      

  4.   


    明确一点,在发生问题之前事务并未结束。
    如果使用同一个数据库连接进行查询,数据确实已入库,不同的是如果是试用SQL SERVER数据库,已经可以查到ID的值,但是使用ORACLE数据库的话并不能查到ID的值。
    我想知道这二者存在这样差距是为什么?
      

  5.   

    oracle没有自增列的概念,你addnew的时候,并没有指定id的值,所以你get的时候,也就取不到值了。
      

  6.   


    oracle未commit,不能看到数据.可自己做实验检验一下
      

  7.   

    sql有自动增长关键字oracle建立序列
      

  8.   

    用oracle序列,nextval取下一值,currval当前值.SQL> create sequence seq_01
      2  increment by 1
      3  start with 1;序列已创建。SQL> select seq_01.nextval from dual;   NEXTVAL
    ----------
             1SQL> select seq_01.currval from dual;   CURRVAL
    ----------
             1SQL> select seq_01.currval from dual;   CURRVAL
    ----------
             1
      

  9.   

    补充一下:在同一对话中取得的currval是一样的,你可以再打开一个对话如下:
    SQL> select seq_01.nextval from dual;   NEXTVAL
    ----------
             2SQL> select seq_01.currval from dual;   CURRVAL
    ----------
             2这时你在上面的对话中执行select seq_01.currval from dual;取到的值仍为1,所以没有问题.
      

  10.   


    我在oracle中建了序列,并建立了触发器(插入新记录时触发),这样也不可以么?addnew的时候不会从序列中读取ID的值么?
      

  11.   


    恩,这个我知道可以通过获取序列当前值的方法得到新添记录的流水ID,但我想问的是既然已经添加了序列和触发器,为什么在addnew()之后,甚至是在Update()之后,仍然不能get到这个新添记录的流水ID,到底触发器何时触发?
    我的触发器是这样定义的
    CREATE OR REPLACE TRIGGER TESTTRIGGER
      BEFORE INSERT ON TEST FOR EACH ROW
    when (NEW.ID IS NULL)
    BEGIN
    SELECT SEQ_TEST_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
    END;