不使用存储过程获取Oracle自增序列(sequence)

本文是以.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;
}

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


出处:http://www.zhaiqianfeng.com    
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4617812.html