.net实现oracle数据库中获取新插入数据的id的方法
程序员文章站
2024-03-04 08:02:05
在sql sever中实现插入数据的自动增长是很容易的,但是在oracle数据库中实现这一操作不是很容易,同时要想在.net中实现获取新插入数据的id,而且不会出现读错的情...
在sql sever中实现插入数据的自动增长是很容易的,但是在oracle数据库中实现这一操作不是很容易,同时要想在.net中实现获取新插入数据的id,而且不会出现读错的情况,就更显得困难了,为了解决在oracle数据中插入的数据能够自增id,同时获取新数据的id,并避免因并发操作而出现的id读错的问题。
数据表结构为test(id,name)
首先,解决数据id自增问题
创建一个序列sequence(sequence详解可从网上搜一下,这里不赘述)
create sequence seq_test
minvalue 1
maxvalue 99999999999999999999999999
start with 21
increment by 1
cache 20;
序列sequence有两个固有属性nextval(下一个值)和currval(当前值)
这样在插入数据的sql语句中可以自动获取自增的id值:insert into test(id,name) values(seq_test.nextval,'name1')
插入完毕后,就可以获取该id值了:select seq_test.currval from dual
注意:序列的currval属性只有在插入语句insert完毕后形成短暂记录,所以必须在下一次数据库操作之前获取该值,否则失效无法获得,为了解决这一问题,我们可以通过创建存储过程来及时获取该值。
然后,创建存储过程,实现插入和获值操作
为了实现该存储过程的可扩展性,存储过程的参数包括三个:strinsertsql(传递insert语句),seqname(获取序列的名称),id(输出值,获取id)
create or replace procedure p_getitemid(
strinsertsql varchar2,
seqname varchar2,
id out varchar2
)
is
strsql varchar(200);
begin
execute immediate strinsertsql;--执行插入语句
strsql:='select '||seqname||'.currval from dual';--获取id的sql语句
execute immediate strsql into id;--执行获取id的sql语句
exception
when others then
dbms_output.put_line(sqlerrm);
end p_getitemid;
最后,利用c#语言,在实现.net中实现程序应用
同样为了实现该功能的扩展行,创建获取id的函数,数据库连接语句从webconfig中获取
public string executeprocedure(string strinsertsql,string proname,string seqname)
{
try
{
if (m_connection_orc.state != system.data.connectionstate.open)
{//从webconfig中获取数据库连接
m_connection_orc.open();
}
}
catch (system.exception ex)
{
}
try
{ //蓝色字体会核心语句
oracleconnection dbconnection_orc;
oraclecommand dbcommand_orc;
dbconnection_orc = m_connection_orc;
dbcommand_orc = new oraclecommand(proname, dbconnection_orc); //proname为存储过程的名字
dbcommand_orc.commandtype = commandtype.storedprocedure;
//在parameters中添加的参数名称必须与数据库中存储过程中的参数名称、类型保持一致
dbcommand_orc.parameters.add("strinsertsql", oracletype.varchar);
dbcommand_orc.parameters.add("seqname", oracletype.varchar);
dbcommand_orc.parameters.add("id", oracletype.varchar);
dbcommand_orc.parameters["id"].direction = parameterdirection.output; //指定参数id为输出类型的值
dbcommand_orc.parameters["strinsertsql"].value = strinsertsql; //获取插入语句
dbcommand_orc.parameters["seqname"].value = seqname; //获取序列名称
dbcommand_orc.executenonquery(); //执行操作
string newid = dbcommand_orc.parameters["id"].value.tostring(); //获取id的值
return newid; //返回id值
}
catch (system.exception ex)
{
throw ex;
}
finally
{
closeconnection();
}
}
至此,获取新插入数据的id值操作就结束了,在编程过程中,调用函数executeprocedure就可以获取id值,哇咔咔
数据表结构为test(id,name)
首先,解决数据id自增问题
创建一个序列sequence(sequence详解可从网上搜一下,这里不赘述)
create sequence seq_test
minvalue 1
maxvalue 99999999999999999999999999
start with 21
increment by 1
cache 20;
序列sequence有两个固有属性nextval(下一个值)和currval(当前值)
这样在插入数据的sql语句中可以自动获取自增的id值:insert into test(id,name) values(seq_test.nextval,'name1')
插入完毕后,就可以获取该id值了:select seq_test.currval from dual
注意:序列的currval属性只有在插入语句insert完毕后形成短暂记录,所以必须在下一次数据库操作之前获取该值,否则失效无法获得,为了解决这一问题,我们可以通过创建存储过程来及时获取该值。
然后,创建存储过程,实现插入和获值操作
为了实现该存储过程的可扩展性,存储过程的参数包括三个:strinsertsql(传递insert语句),seqname(获取序列的名称),id(输出值,获取id)
复制代码 代码如下:
create or replace procedure p_getitemid(
strinsertsql varchar2,
seqname varchar2,
id out varchar2
)
is
strsql varchar(200);
begin
execute immediate strinsertsql;--执行插入语句
strsql:='select '||seqname||'.currval from dual';--获取id的sql语句
execute immediate strsql into id;--执行获取id的sql语句
exception
when others then
dbms_output.put_line(sqlerrm);
end p_getitemid;
最后,利用c#语言,在实现.net中实现程序应用
同样为了实现该功能的扩展行,创建获取id的函数,数据库连接语句从webconfig中获取
复制代码 代码如下:
public string executeprocedure(string strinsertsql,string proname,string seqname)
{
try
{
if (m_connection_orc.state != system.data.connectionstate.open)
{//从webconfig中获取数据库连接
m_connection_orc.open();
}
}
catch (system.exception ex)
{
}
try
{ //蓝色字体会核心语句
oracleconnection dbconnection_orc;
oraclecommand dbcommand_orc;
dbconnection_orc = m_connection_orc;
dbcommand_orc = new oraclecommand(proname, dbconnection_orc); //proname为存储过程的名字
dbcommand_orc.commandtype = commandtype.storedprocedure;
//在parameters中添加的参数名称必须与数据库中存储过程中的参数名称、类型保持一致
dbcommand_orc.parameters.add("strinsertsql", oracletype.varchar);
dbcommand_orc.parameters.add("seqname", oracletype.varchar);
dbcommand_orc.parameters.add("id", oracletype.varchar);
dbcommand_orc.parameters["id"].direction = parameterdirection.output; //指定参数id为输出类型的值
dbcommand_orc.parameters["strinsertsql"].value = strinsertsql; //获取插入语句
dbcommand_orc.parameters["seqname"].value = seqname; //获取序列名称
dbcommand_orc.executenonquery(); //执行操作
string newid = dbcommand_orc.parameters["id"].value.tostring(); //获取id的值
return newid; //返回id值
}
catch (system.exception ex)
{
throw ex;
}
finally
{
closeconnection();
}
}
至此,获取新插入数据的id值操作就结束了,在编程过程中,调用函数executeprocedure就可以获取id值,哇咔咔
推荐阅读
-
.net实现oracle数据库中获取新插入数据的id的方法
-
.net实现oracle数据库中获取新插入数据的id的方法
-
Java实现JSP在Servelt中连接Oracle数据库的方法
-
Java实现JSP在Servelt中连接Oracle数据库的方法
-
Oracle数据库实现获取前几条数据的方法
-
insert和select结合实现"插入某字段在数据库中的最大值+1"的方法
-
PHP获取数据库表中的数据插入新的表再原删除数据方法
-
asp实现批量插入表单中的数据到数据库的方法
-
python中sqllite插入numpy数组到数据库的实现方法
-
C# ASP.NET+MySQL数据库命名了1个long字段,和C#的保留字重名,并且和MySQL数据库的关键字重名,如何用Parameters.AddWithValue方法插入新记录到数据库