oracle数据库,表中有id(自增字段,主键), insert 语句插入一条记录后要求,返回当前插入记录的id値。

oracle 数 据 库,表中有id(自增字段,主键), insert 语句插入一条记录后要求,返回当前插入记录的id値。这个ID不是主ID,ID里的值是CASE_SEQ.Nextval一个自增序列,我想获得当前的插入的记录里的自增序列的值,有人说的方法如下:
create sequence CASE_SEQ
minvalue 0
maxvalue xxxxxxxx
start with 1
increment by 1
cache 20;
select CASE_SEQ.nextval from dual
这个放法正确吗?
如果正确那 asp 里面掉用怎么而写正确
string str = "insert into PATIENT_T(pid,name) values(CASE_SEQ.Nextval,'黎明')";
str += "Select CASE_SEQ.currval from dual";

OracleConnection conn = DB.getCon();
OracleCommand cmd = conn.CreateCommand();
conn.Open();
int returnID = 0;
cmd.CommandText = str;
returnID = Convert.ToInt32(cmd.ExecuteScalar());
//returnID = cmd.ExecuteNonQuery();
conn.Close();
有错误啊 正确的应该怎么改 希望大虾指点,谢谢!!!!
我想要得到 returnID 的值 先看sql 语句对吗?然后怎么在 asp中写具体调用的指令,和返回的值类型,还用强制转化吗? 本人是新手希望有人能够解答,最好考虑到获得的CASE_SEQ.Nextval的唯一性,考虑到有多个用户同时丛客户端写插入语句,怎么知道得到的ID就是自己刚才插入的自动序列ID,不会是别人的序列ID,谢谢了,本人新手!!!

sequence就是一个序列,你每次执行 select CASE_SEQ.nextval from dual 的时候都会返回唯一的一个ID号,因此你可以先执行这个select取到这个ID,如果这个时候有多个用户在执行这个操作,那么他们select到的ID绝对跟你的不一样(sequence就是保证这一点的)。然后你就可以用这个ID插入记录,然后再返回这个ID就OK了。
代码:
string sql = "Select CASE_SEQ.currval from dual";
OracleConnection conn = DB.getCon();
OracleCommand cmd = conn.CreateCommand();
conn.Open();
string returnID = null;
cmd.CommandText = sql;
returnID = Convert.ToString(cmd.ExecuteScalar()); //获取ID
sql = "insert into PATIENT_T(pid,name) values(returnID,'黎明')"; //将ID插入数据库
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
conn.Close();
结束了,差不多就是这样,楼主自己调试一下就行了,注意ID在数据库中应该是varcahr类型的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-21
string str = "insert into PATIENT_T(pid,name) values(CASE_SEQ.Nextval,'黎明')";
str += "Select CASE_SEQ.currval from dual";

这是两条SQL语句,在并发的时候不能保证ID就是你想要的那个
方法1: 把你的方法定义成synchronized,或把数据库操作部分放到synchronized块中,JAVA中是这样,我想C#应该也差不多吧

方法2: Select CASE_SEQ.nextval from dual, 先取出序列的值,放到一个变量中,例如: pid
然后再插入表中
insert into PATIENT_T(pid,name) values(pid,'黎明')
剩下你自己可以完成了
第2个回答  2011-01-21
建议是 先 select CASE_SEQ.nextval from dual 读取到唯一的 新的ID, 保存到一个变量中。
然后用这个新的 ID, 插入到表中去.
insert into PATIENT_T(pid,name) values(变量,'黎明')

先 insert 后 Select CASE_SEQ.currval from dual 的话。
如果很短的时间内,有多个 INSERT 同时发生的话,可能会发生数据的冲突。
相似回答