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类型的
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,'黎明')
剩下你自己可以完成了
建议是 先 select CASE_SEQ.nextval from dual 读取到唯一的 新的ID, 保存到一个变量中。
然后用这个新的 ID, 插入到表中去.
insert into PATIENT_T(pid,name) values(变量,'黎明')
先 insert 后 Select CASE_SEQ.currval from dual 的话。
如果很短的时间内,有多个 INSERT 同时发生的话,可能会发生数据的冲突。