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,只要规划好数据库的自增字段,自动生成的代码中,数据访问类是不要修改外音讯,就好健全支持于加班。

 

相关文章