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#代码)
View Code#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
以前一直使用SQL server,最近开始接触Oracle,记录一下遇到的坑。
对了 记住Oracle中如果有多条语句一起执行,在每条语句结尾加;(分号,当前语句结束)