在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

获得Oracle中刚插入的数据的ID(for produce)的更多相关文章

  1. C#获取刚插入的数据的id

    在开发程序中我们经常会遇到两个表或多个表关联同时插入数据的需求. 那么我们刚给主表插入一条数据,接着给副表插入数据时其中一个字段要存储与主表关联的id,那么我们该怎么获取刚插入的那条数据的id呢?   ...

  2. C#利用ODP.NET往oracle中高效插入百万数据

    由于工作的原因,要使用winform来处理大量的数据,但是c#自带的System.data.OracleClient效率不是很高,在网上找了很久,找到了ODP.NET,是oracle为c#提供的.貌似 ...

  3. Mysql 中获取刚插入的自增长id的值

    insert into user (username,password) VALUES ('); //获取刚插入的自增长id的值 select last_insert_id(); 在MySQL中,使用 ...

  4. Oracle中批量插入

    为了防止OracleConnection的重复打开和关闭,使用begin end:将sql语句包在里面,然后一次性执行提高插入的效率. 下面代码中要插入的数据在list集合中,如果list集合的cou ...

  5. Oracle中如何插入特殊字符: & 和 ' (多种解决方案)

    Oracle中如何插入特殊字符:& 和 ' (多种解决方案)今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Inse ...

  6. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  7. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)

    今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Insert语句,怎么会有自定义变量呢?后来搜索了一下关键字AMP发现,原来 ...

  8. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)-转载

    文章出处:http://blog.sina.com.cn/s/blog_5f39af320101gb3f.html 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量A ...

  9. oracle中字符串与表数据拼接的用法--“||”

    测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...

随机推荐

  1. centos 下安装python3.6.2

    具体详情: http://www.cnblogs.com/vurtne-lu/p/7068521.html

  2. Android系统--Binder系统具体框架分析(一)

    Binder系统具体框架分析(一) 一.Binder系统核心框架 1. IPC:Inter-Process Communication, 进程间通信 A进程将数据原原本本发送B进程,主要负责进程间数据 ...

  3. 关于C++ 中的this 的理解

    关键字this 通常被用在一个class内部,指正在被执行的该class的对象(object)在内存中的地址.它是一个指针,其值永远是自身object的地址.

  4. 一个gpio 不受控制的bug

    前几天调试一个flash灯的驱动程序,这可ic 有两个控制pin, 一个叫en1 一个叫en2, 根据spec的说明,不同的组合将产生不同的输出电流.但我发现,那个en1 这个pin 死活是拉不高的, ...

  5. Windows系统 本地文件如何复制到远程服务器

    很多人在使用远程服务器的时候往往要将本地的文件传输到远程服务器内,方法有很多种,下面介绍下如何使用Windows自带的远程桌面连接程序将文件复制到远程服务器内. 1.首先,点击windows开始按钮, ...

  6. Python面向对象编程高级特性

    ***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...

  7. oracle 导出

    一.导出csv文件 利用Oracle中的Spool缓冲池技术可以实现Oracle数据导出到文本文件. 1).在Oracle PL/SQL中输入缓冲开始命令,并指定输出的文件名: spool /tmp/ ...

  8. Hadoop心跳机制源码分析

    正文: 一.体系背景 首先和大家说明一下:hadoop的心跳机制的底层是通过RPC机制实现的,这篇文章我只介绍心跳实现的代码,对于底层的具体实现,大家可以参考我的另几篇博客: 1. hadoop的RP ...

  9. DS 和【ADDRESS】学习记录

    CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址. 内存单元由2部分组成. 8086CPU中,内存地址由以下组成. 1:段地址 2:偏移地址 8086CPU中,有一个DS寄存器地址,通常用 ...

  10. VC SOCKET 压缩通信学习

    Server................// Server.cpp : Defines the entry point for the console application. // #inclu ...