zoukankan      html  css  js  c++  java
  • 获得Oracle中刚插入的数据的ID(for produce)

    在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值,哇咔咔

    [转]http://blog.csdn.net/whx_1113/article/details/8649538

  • 相关阅读:
    [水煮 ASP.NET Web API2 方法论](3-6)万能路由
    [水煮 ASP.NET Web API2 方法论](3-5)路由约束
    [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项
    [水煮 ASP.NET Web API2 方法论](3-3)路由默认值
    [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由
    [转载自简书] ASPNetCore上传大文件碰到的一些问题总结
    [转载] 关于web.config
    [转载] sessionState 4种mode模式
    [转载] web.config 配置详解
    文档注释标记
  • 原文地址:https://www.cnblogs.com/adolphyang/p/4752161.html
Copyright © 2011-2022 走看看