Database2Sharp生成的Enterprise Library架构对Oracle自动增进列字段的支撑

自行增进的主键字段是个好东西,提供了一个相比较有意义和可观望的字段内容(相对GUID来说),插入的时候,不用管它的值,数据库自动追加;但它也是一个不佳的事物,即便管理不好,可能会招致冲突。本文暂且不研讨其优劣,因为存在就是硬道理,很多时候,大家都是使用自增加字段的,尤其是对于SqlServer数据开发以来。

 本文演讲一下在Database2Sharp(软件下载地址:http://www.iqidi.com/database2sharp.htm)生成的Enterprise
Library架构怎么着贯彻Oracle的自增加的协理。同时也会有意无意说说对SqlServer、Access的兑现。

 Database2Sharp生成的Enterprise
Library架构其实对Oracle内置了对自增进系列的支撑,在数据库访问层的基类BaseDAL中,大家看来下边的代码。

     /// <summary>

    /// 数据访问层的基类
    /// </summary>
    public abstract class BaseDAL<T> : IBaseDAL<T> where T : BaseEntity, new()
    {
        #region 构造函数

        protected string tableName;//须要开端化的靶子表名
        protected string primaryKey;//数据库的主键字段名
        protected string sortField = “ID”;//排序字段
        private bool isDescending = false;//

        protected string selectedFields = ” * “;//选拔的字段,默许为所有(*)
        private string seqField = “”;//指定尤其字段是用连串来支配它的值的,一般为主键
        private string seqName = “”;//指定的队列名称,提议规则为:SEQ_表名称
        
        /// <summary>
        /// 指定尤其字段是用系列来控制它的值的,一般为主键
        /// </summary>
        public string SeqField
        {
            get { return seqField; }
            set { seqField = value; }
        }

        /// <summary>
        /// 指定的体系名称,指出规则为:SEQ_表名称
        /// </summary>
        public string SeqName
        {
            get { return seqName; }
            set { seqName = value; }
        }

那段代码定义了五个特性,一个是系列字段名称(一般是主键,如ID),一个是我们为该字段指定的队列对象名称,大家那里提议的名号是”SEQ_表名称”,当然也得以应用任意的名目,合理统一就可以了。那多少个特性在基类不需求修改,只需求在具体的数目访问对象(如数据访问层中的Customer类)构造函数中,指定连串字段和系列对象即可。

下边大家看看表盒序列的台本代码,例如我成立一个客户表,其字段ID为自增系列,我的创始脚本是。

 create table ALL_CUSTOMER

(
  ID          NUMBER not null,
  USERNUMBER  VARCHAR2(50),
  NAME        VARCHAR2(50),
  TYPE        VARCHAR2(50),
  AREA        VARCHAR2(50),
  COMPANY     VARCHAR2(50),
  ADDRESS     VARCHAR2(50),
  TELEPHONE1  VARCHAR2(50),
  TELEPHONE2  VARCHAR2(50),
  TELEPHONE3  VARCHAR2(50),
  TELEPHONE4  VARCHAR2(50),
  TELEPHONE5  VARCHAR2(50),
  CREATEDATE  DATE,
  SHOP_ID     VARCHAR2(50),
  NOTE        VARCHAR2(255),
  LASTUPDATED DATE,
  constraint PK_ALL_CUSTOMER primary key (ID)
);

create sequence SEQ_ALL_CUSTOMER
minvalue 1
maxvalue 999999999999999999999999999
start with 1220
increment by 1
cache 20;

commit;

 

注意SEQ_ALL_CUSTOMER就是种类对象名称,那么大家再插入的时候,应该什么写入连串字段的值,并且得到新的值作为再次来到值的吧?

在BaseDAL中,有一个Insert2的章程,是专程处理
自增种类函数,并且再次来到创建记录的自增字段的值的,大家来探望其源码。

         /// <summary>

        /// 添加记录
        /// </summary>
        /// <param name=”recordField”>Hashtable:键[key]为字段名;值[value]为字段对应的值</param>
        /// <param name=”targetTable”>要求操作的靶子表名称</param>
        /// <param name=”trans”>事务对象,假使应用工作,传入事务对象,否则为Null不利用工作</param>
        public int Insert2(Hashtable recordField, string targetTable, DbTransaction trans)
        {
            int result = -1;
            string fields = “”; // 字段名
            string vals = “”; // 字段值
            if (recordField == null || recordField.Count < 1)
            {
                return result;
            }

            List<OracleParameter> paramList = new List<OracleParameter>();
            IEnumerator eKeys = recordField.Keys.GetEnumerator();

            while (eKeys.MoveNext())
            {
                string field = eKeys.Current.ToString();
                fields += field + “,”;
                if (!string.IsNullOrEmpty(seqField) && !string.IsNullOrEmpty(seqName)
                    && (field == seqField))
                {
                    vals += string.Format(“{0}.NextVal,”, seqName);
                }
                else
                {
                    vals += string.Format(“:{0},”, field);
                    object val = recordField[eKeys.Current.ToString()];
                    paramList.Add(new OracleParameter(“:” + field, val));
                }
            }

            fields = fields.Trim(‘,’);//除去前后的逗号
            vals = vals.Trim(‘,’);//除去前后的逗号
            string sql = string.Format(“INSERT INTO {0} ({1}) VALUES ({2})”, targetTable, fields, vals);

            Database db = DatabaseFactory.CreateDatabase();
            DbCommand command = db.GetSqlStringCommand(sql);
            command.Parameters.AddRange(paramList.ToArray());

            if (trans != null)
            {
                db.ExecuteNonQuery(command, trans);

                sql = string.Format(“SELECT {0}.Currval ID From Dual”, seqName);
                command = db.GetSqlStringCommand(sql);
                result = Convert.ToInt32(db.ExecuteScalar(command, trans).ToString());
            }
            else
            {
                db.ExecuteNonQuery(command);

                sql = string.Format(“SELECT {0}.Currval ID From Dual”, seqName);
                command = db.GetSqlStringCommand(sql);
                result = Convert.ToInt32(db.ExecuteScalar(command).ToString());
            }

            return result;
        }

 

里头大家看清是或不是有自增系列ID和其名目(非空字符),假设有则动用那段代码,来写入自增连串的下一个值NextVal(新增值),作为那么些字段的值。

vals += string.Format(“{0}.NextVal,”, seqName); 

 即使要回去插入的自增序列值,那么我们利用系列对象的Currval 就足以了。下边是回来插入的字段内容。

sql = string.Format(“SELECT {0}.Currval ID From Dual”, seqName); 

那般对于写入新的自增进值并重临就兑现了。

对SqlServer和Access自拉长字段的支撑 

对此SqlServer,已毕自增加字段就进一步有利了,由于没有Oracle连串对象那么辛勤,所以只要求在切切实实的数据库访问对象中,构建写入字段的Hash表中,忽略该字段就可以了(代码已经自动生成,不用管理的)。其回来刚刚插入的自增内容,则在插入的说话后边增加一条语句就可以了,语句如下。

 SELECT SCOPE_IDENTITY()

对于Access的数据库,原理和SqlServer一样,然则须要回到刚刚插入的自增加值的时候,使用那段语句就足以了。

 SELECT @@IDENTITY

 对于SqlServer和Access,只要规划好数据库的自增字段,自动生成的代码中,数据访问类是不用修改任何消息,就可以圆满援助自增种类。

 

相关文章