SQL server、Oracle中拿到新增列时的自增字段值

1.SQL server

 

INSERT INTO NEWS (TITLE) VALUES ("TITLE");

SELECT @@IDENTITY--第一种方式

SELECT @ID= SCOPE_IDENTITY()--第一种方式

--第一种方式是全局变量,如果是多条INSERT语句同时执行的话,取值可能出现误差
--建议使用第二种方式

 

 

2.Oracle

Oracle中不能像SQL server中创建自增标识符。如果需要有自增列的话可以用自增序列来帮助实现。

创建自增序列

       DROP SEQUENCE WEB_FEEDBACK_SEQ; /* 若以存在则删除*/

       CREATE SEQUENCE WEB_FEEDBACK_SEQ
       INCREMENT BY 1 -- 每次加几个
       START WITH 1 -- 从1开始计数
       NOMAXVALUE -- 不设置最大值
       NOCYCLE -- 一直累加,不循环
       NOCACHE; -- 不建缓冲区

新增一条数据不需要返回自增列值时可以用触发器实现

创建触发器

CREATE OR REPLACE TRIGGER WEB_FEEDBACK_TRIGGER      --WEB_FEEDBACK_TRIGGER    触发器名称
BEFORE INSERT ON WEB_FEEDBACK                       --WEB_FEEDBACK是表名
FOR EACH ROW
DECLARE
NEXTID NUMBER;
BEGIN
IF :NEW.KEY_ID IS NULL OR :NEW.KEY_ID=0 THEN                --KEY_ID 是列名
SELECT WEB_FEEDBACK_SEQ.NEXTVAL                     --WEB_FEEDBACK_SEQ 正是刚才创建的序列
INTO NEXTID
FROM SYS.DUAL;
:NEW.KEY_ID:=NEXTID;
END IF; 
END WEB_FEEDBACK_TRIGGER ;

如果新增一条数据时需要返回自增列值可以这样实现(C#代码)

        #region 增删改数据访问
        /// <summary>
        /// 增删改数据访问
        /// </summary>
        /// <param name="CommandText">语句</param>
        /// <param name="OraParams">参数</param>
        /// <returns></returns>
        public static int EditData(string CommandText, OracleParameter[] OraParams = null)
        {
            int num = 0;
            try
            {
                string connstr = ShopDal.conntion();
                OracleConnection conn = new OracleConnection(connstr);
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                OracleCommand command = conn.CreateCommand();
                command.Connection = conn;
                command.CommandText = CommandText;

                for (int i = 0; i < OraParams.Length; i++)
                {
                    command.Parameters.Add(OraParams[i]);
                }

                num = command.ExecuteNonQuery();

                command.Parameters.Clear();
                conn.Close();
            }
            catch (Exception ex)
            {

                throw;
            }
            return num;
        }
        #endregion

        #region 获取主键ID
        /// <summary>
        /// 获取主键ID
        /// </summary>
        /// <returns></returns>
        public static string MarkSenumber()
        {
            string Senumber = string.Empty;
            try
            {
                string connstr = ShopDal.conntion();
                OracleConnection conn = new OracleConnection(connstr);
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                OracleCommand command = conn.CreateCommand();
                command.Connection = conn;
                command.CommandText = "Select WEB_FEEDBACK_SEQ.nextval from dual";
                Senumber = command.ExecuteScalar().ToString(); ;
                command.Parameters.Clear();
                conn.Close();
            }
            catch (Exception ex)
            {

                throw;
            }
            return Senumber;
        }
        #endregion

        #region 添加
        public static int SubmitFeed_Methods(string TITLE)
        {
            //获取主键ID
            string Senumber = MarkSenumber();

            OracleParameter[] OraParams = new OracleParameter[2];
            OraParams[0] = new OracleParameter(":ID", OracleDbType.Varchar2, 25);
            OraParams[1] = new OracleParameter(":TITLE", OracleDbType.Int32);

            OraParams[0].Value = Senumber;
            OraParams[1].Value = Convert.ToInt32(TITLE);

            string CommandText = @" 
                                    insert into web_feedback(ID, TITLE) values(:ID,:TITLE)";

            int num = EditData(CommandText, OraParams);

            return num;
        }
        #endregion
View Code

 

以前一直使用SQL server,最近开始接触Oracle,记录一下遇到的坑。

对了 记住Oracle中如果有多条语句一起执行,在每条语句结尾加;(分号,当前语句结束)

 

posted @ 2018-04-11 13:07  笑叹、  阅读(935)  评论(0编辑  收藏  举报