博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不使用存储过程获取Oracle自增序列(sequence)
阅读量:5221 次
发布时间:2019-06-14

本文共 2154 字,大约阅读时间需要 7 分钟。

本文是以.Net的编码方式演示如何不使用存储过程获取Oracle的序列值,方便开发者在插入数据库记录时间获取当前ID等关键字段。

声明

  • 为了简化使用了OracleHeper类;
  • CALENDAR是日程表,只有一个CALENDAR_ID字段;
  • SEQ_CALENDAR_ID为序列(sequence);

方法一,先获取序列,然后把序列当做值插入数据库 

  1. 优点:代码简单直观,易懂;
  2. 缺点:需要两次交互,性能不佳;  
  3. 注意事项:记得关闭Reader;
public int AddCalendar_First() {    int calendarId = 0;    try {        string sql = "SELECT SEQ_CALENDAR_ID.NEXTVAL FROM DUAL";        IDataReader idr = OracleHelper.ExecuteReader(CommandType.Text, sql);        if (idr.Read()) {            calendarId = int.Parse(idr[0].ToString());        }        idr.Close();        sql = "INSERT INTO CALENDAR(CALENDAR_ID)VALUES(:PARME_CALENDAR_ID)";        OracleParameter[] parmes = { new OracleParameter("PARME_CALENDAR_ID", OracleDbType.Int32) };        OracleHelper.ExecuteNonQuery(CommandType.Text, sql, parmes);    } catch (Exception ex) {        //记录日志    }    return calendarId;}

方法二 先插入数据,再获取序列值

  1. 优点:适用于后期不易改造程序的妥协;
  2. 缺点:需要两次交互,性能不佳;
  3. 注意事项:虽然声称序列是使用的回话隔离,但如果多个应用并发访问一个库,将长生混乱;
public int AddCalendar_Second() {    int calendarId = 0;    try {        string sql = "INSERT INTO CALENDAR(CALENDAR_ID)VALUES(SEQ_CALENDAR_ID.NEXTVAL)";        OracleHelper.ExecuteNonQuery(CommandType.Text, sql, null);        IDataReader idr = OracleHelper.ExecuteReader(CommandType.Text, "SELECT SEQ_CALENDAR_ID.CURRVAL FROM DUAL");        if (idr.Read()) {            calendarId = int.Parse(idr[0].ToString());        }        idr.Close();    } catch (Exception ex) {        //记录日志    }    return calendarId;}

方法三 使用returning into语法

  1. 优点:性能最好;
  2. 缺点:目前没发现;
  3. 注意事项:记得设置Direction类型;
public int AddCalendar_Third() {    int calendarId = 0;    try {        string sql = "INSERT INTO CALENDAR(CALENDAR_ID)VALUES(SEQ_CALENDAR_ID.NEXTVAL) RETURNING CALENDAR_ID INTO :ID";        OracleParameter[] parmes = {            new OracleParameter("ID",OracleDbType.Int32)        };        parmes[0].Direction = ParameterDirection.ReturnValue;        OracleHelper.ExecuteNonQuery(CommandType.Text, sql, parmes);        calendarId = int.Parse(parmes[0].Value.ToString());    } catch (Exception ex) {        //记录日志    }    return calendarId;}

三种方法中方法三最佳,可考虑使用。

转载于:https://www.cnblogs.com/zhaiqianfeng/archive/2012/09/28/4617812.html

你可能感兴趣的文章
BS调用本地应用程序的步骤
查看>>
常用到的多种锁(随时可能修改)
查看>>
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>