现对一表进行如下操作,主键为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.定义并启动一个事务
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之后结束事务。
办法有2个:
1.自己取得oracle序列的下一值.
2.触发器
明确一点,在发生问题之前事务并未结束。
如果使用同一个数据库连接进行查询,数据确实已入库,不同的是如果是试用SQL SERVER数据库,已经可以查到ID的值,但是使用ORACLE数据库的话并不能查到ID的值。
我想知道这二者存在这样差距是为什么?
oracle未commit,不能看到数据.可自己做实验检验一下
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
SQL> select seq_01.nextval from dual; NEXTVAL
----------
2SQL> select seq_01.currval from dual; CURRVAL
----------
2这时你在上面的对话中执行select seq_01.currval from dual;取到的值仍为1,所以没有问题.
我在oracle中建了序列,并建立了触发器(插入新记录时触发),这样也不可以么?addnew的时候不会从序列中读取ID的值么?
恩,这个我知道可以通过获取序列当前值的方法得到新添记录的流水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;