Exemplo n.º 1
0
        internal int Delete(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            var result = dba.ExecuteText(_deleteSql.Value, item.Id);

            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 执行 sql 插入一个实体到数据库中。
        /// 基类的默认实现中,只是简单地实现了 sql 语句的生成和执行。
        /// </summary>
        /// <param name="dba"></param>
        /// <param name="item"></param>
        public virtual void Insert(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            var parameters = this.GenerateInsertSqlParameters(item, false);

            dba.ExecuteText(_insertSql.Value, parameters);
        }
Exemplo n.º 3
0
        internal int Delete(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            if (this._deleteSQL == null)
            {
                this._deleteSQL = this.GenerateDeleteSQL();
            }

            var result = dba.ExecuteText(this._deleteSQL, item.Id);

            return(result);
        }
Exemplo n.º 4
0
        internal int Delete(IDbAccesser dba, IConstraint where)
        {
            if (where == null) throw new ArgumentNullException("where");

            EnsureMappingTable();

            var sql = new StringWriter();
            sql.Write("DELETE FROM ");
            sql.AppendQuoteName(this);
            sql.Write(" WHERE ");

            var generator = this.CreateSqlGenerator();
            generator.Generate(where as SqlNode);
            var whereSql = generator.Sql;
            sql.Write(whereSql.ToString());

            return dba.ExecuteText(sql.ToString(), whereSql.Parameters);
        }
Exemplo n.º 5
0
        public override void Insert(IDbAccesser dba, Entity item)
        {
            var idColumn = this.IdentityColumn;

            if (idColumn != null)
            {
                var idProvider = (item as IEntityWithId).IdProvider;
                var hasId      = idProvider.IsAvailable(item.Id);

                string   insertSql  = hasId ? _insertSqlWithId.Value : _insertSql.Value;
                object[] parameters = this.GenerateInsertSqlParameters(item, hasId);

                if (hasId)
                {
                    //打开 Identity 列可以手动插入
                    dba.RawAccesser.ExecuteText($"SET IDENTITY_INSERT {Name} ON ");
                }

                dba.ExecuteText(insertSql, parameters);

                if (!hasId)
                {
                    var idValue = dba.RawAccesser.QueryValue("SELECT @@IDENTITY;");
                    idValue = TypeHelper.CoerceValue(idProvider.KeyType, idValue);
                    idColumn.WritePropertyValue(item, idValue);

                    //如果实体的 Id 是在插入的过程中生成的,
                    //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。
                    item.SyncIdToChildren();
                }
                else
                {
                    //关闭 Identity 列可以手动插入
                    dba.RawAccesser.ExecuteText($"SET IDENTITY_INSERT {Name} OFF ");
                }
            }
            else
            {
                base.Insert(dba, item);
            }
        }
Exemplo n.º 6
0
        public override void Insert(IDbAccesser dba, Entity item)
        {
            var idColumn = this.IdentityColumn;

            if (idColumn != null)
            {
                var    isIdentityHasValue = (item as IEntityWithId).IdProvider.IsAvailable(item.Id);
                string insertSql          = isIdentityHasValue ? _withIdInsertSql ?? (_withIdInsertSql = $"{this.GenerateInsertSQL(true)}") :
                                            _insertSql ?? (_insertSql = $"{this.GenerateInsertSQL()} ");

                var parameters = Columns.Where(c => c.CanInsert || (c.Info.IsIdentity && isIdentityHasValue))
                                 .Select(c => c.ReadParameterValue(item))
                                 .ToArray();

                if (isIdentityHasValue)
                {
                    //打开 Identity 列可以手动插入
                    dba.RawAccesser.ExecuteText($"SET IDENTITY_INSERT {Name} ON ");
                }
                dba.ExecuteText(insertSql, parameters);
                if (!isIdentityHasValue)
                {
                    var idValue = dba.RawAccesser.QueryValue("SELECT @@IDENTITY;");
                    idValue = TypeHelper.CoerceValue((item as IEntityWithId).IdProvider.KeyType, idValue);
                    idColumn.LoadValue(item, idValue);
                }
                else
                {
                    //关闭 Identity 列可以手动插入
                    dba.RawAccesser.ExecuteText($"SET IDENTITY_INSERT {Name} OFF ");
                }

                //如果实体的 Id 是在插入的过程中生成的,
                //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。
                item.SyncIdToChildren();
            }
            else
            {
                base.Insert(dba, item);
            }
        }
Exemplo n.º 7
0
        public virtual void Insert(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            if (this._insertSQL == null)
            {
                this._insertSQL = this.GenerateInsertSQL();
            }

            var parameters = new List <object>();

            foreach (RdbColumn column in _columns)
            {
                if (this.CanInsert(column))
                {
                    var value = column.ReadParameterValue(item);
                    parameters.Add(value);
                }
            }

            dba.ExecuteText(this._insertSQL, parameters.ToArray());
        }
Exemplo n.º 8
0
        /// <summary>
        /// 获取指定大小批量的连续的 Id 号。返回第一个 Id 号的值。
        /// </summary>
        /// <param name="dba">The dba.</param>
        /// <param name="table">The table.</param>
        /// <param name="size">需要连续的多少个 Id 号。</param>
        /// <returns></returns>
        private static long GetBatchIDs(IDbAccesser dba, RdbTable table, int size)
        {
            /*********************** 代码块解释 *********************************
             * 算法解释:
             * 1.先查出当前最大的 ID 值;
             * 2.计算出所需要使用的区间的起始、终止值 [start,end];
             * 3.然后设置 IDENTITY 的种子值为终止值;
             * 4.由于上两步 SQL 执行过程中有可能其它线程使用了这个 IDENTITY 而造成 [start,end] 中的值被使用,
             * 所以需要对表中的数据进行检测,如果没有被使用,才把这些 ID 值返回。
             * 如果被使用了,则上述过程重来一次即可。
             *
             * IDENTITY 的操作方法:http://www.cnblogs.com/gaizai/archive/2013/04/23/3038318.html
             **********************************************************************/

            var tableName = table.Name;

            lock (_identityLock)
            {
                while (true)
                {
                    var currentValue = Convert.ToInt64(dba.QueryValue(string.Format("SELECT IDENT_CURRENT('{0}')", tableName)));
                    var start        = currentValue + 1;
                    var end          = start + size - 1;
                    dba.ExecuteText(string.Format("DBCC CHECKIDENT('{0}', RESEED, {1})", tableName, end));

                    var concurrency = dba.QueryValue(string.Format(
                                                         "SELECT 1 WHERE EXISTS (SELECT 1 FROM {0} WHERE {1} >= {2} AND {1} <= {3})",
                                                         tableName, table.IdentityColumn.Name, start, end
                                                         ));
                    if (concurrency == null)
                    {
                        return(start);
                    }
                }
            }

            throw new InvalidOperationException("生成 Id 时,发生未知错误。");
        }
Exemplo n.º 9
0
        /// <summary>
        /// 执行 sql 插入一个实体到数据库中。
        /// 基类的默认实现中,只是简单地实现了 sql 语句的生成和执行。
        /// </summary>
        /// <param name="dba"></param>
        /// <param name="item"></param>
        public virtual void Insert(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            if (this._insertSQL == null)
            {
                this._insertSQL = this.GenerateInsertSQL();
            }

            var parameters = new List <object>(10);

            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (column.CanInsert)
                {
                    var value = column.ReadParameterValue(item);
                    parameters.Add(value);
                }
            }

            dba.ExecuteText(this._insertSQL, parameters.ToArray());
        }
Exemplo n.º 10
0
        protected override void RunCore(IDbAccesser db)
        {
            var count = Convert.ToInt32(db.QueryValue(
                                            "SELECT COUNT(0) FROM ALL_SEQUENCES WHERE SEQUENCE_NAME = {0} AND SEQUENCE_OWNER = {1}",
                                            this.SequenceName,
                                            DbConnectionSchema.GetOracleUserId(db.ConnectionSchema).ToUpper()
                                            ));

            if (count <= 0)
            {
                db.ExecuteText(string.Format(
                                   @"CREATE SEQUENCE {0}
MINVALUE 1
MAXVALUE 99999999999999999
START WITH 1
INCREMENT BY 1
NOCACHE
ORDER", this.SequenceName));
            }

            //            var sql = string.Format(@"DECLARE T_COUNT NUMBER;
            //BEGIN
            //    SELECT COUNT(*) INTO T_COUNT FROM DUAL WHERE EXISTS(SELECT * FROM ALL_SEQUENCES WHERE SEQUENCE_NAME='{0}');
            //    IF T_COUNT = 0 THEN
            //        EXECUTE IMMEDIATE '
            //        CREATE SEQUENCE {0}
            //        MINVALUE 1
            //        MAXVALUE 99999999999999999
            //        START WITH 1
            //        INCREMENT BY 1
            //        NOCACHE
            //        ORDER
            //        ';
            //    END IF;
            //END;", this.SEQName(op));
        }
Exemplo n.º 11
0
        internal int Update(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            var parameters = new List<object>(10);
            string updateSql = null;

            //是否有需要更新的 lob 字段。
            bool hasUpdatedLOBColumns = false;
            List<RdbColumn> lobColumns = null;

            if (_hasLOB)
            {
                lobColumns = new List<RdbColumn>();

                for (int i = 0, c = _columns.Count; i < c; i++)
                {
                    var column = _columns[i];
                    //如果一个 lob 属性的值存在,则表示需要更新。
                    //(可能被设置了,也可能只是简单地读取了一下,没有变更值。这时也简单地处理。)
                    if (column.IsLOB && item.FieldExists(column.Info.Property))
                    {
                        lobColumns.Add(column);
                        hasUpdatedLOBColumns = true;
                    }
                }
            }

            if (!hasUpdatedLOBColumns)
            {
                //如果没有 LOB,则直接缓存上更新语句。
                if (_updateSQL == null) { _updateSQL = this.GenerateUpdateSQL(null); }
                updateSql = _updateSQL;
            }
            else
            {
                updateSql = this.GenerateUpdateSQL(lobColumns);
            }

            //更新所有非 lob 的字段
            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (!column.Info.IsPrimaryKey && !column.IsLOB)
                {
                    var value = column.ReadParameterValue(item);
                    parameters.Add(value);
                }
            }

            //更新需要更新的 lob 字段
            if (hasUpdatedLOBColumns)
            {
                for (int i = 0, c = lobColumns.Count; i < c; i++)
                {
                    var column = lobColumns[i];
                    if (!column.Info.IsPrimaryKey)
                    {
                        var value = column.ReadParameterValue(item);
                        parameters.Add(value);
                    }
                }
            }

            //Id 最后加入
            parameters.Add(item.Id);

            int res = dba.ExecuteText(updateSql, parameters.ToArray());
            return res;
        }
Exemplo n.º 12
0
        internal int Delete(IDbAccesser dba, IConstraint where)
        {
            if (where == null) throw new ArgumentNullException("where");

            EnsureMappingTable();

            var sql = new StringWriter();
            sql.Write("DELETE FROM ");
            sql.AppendQuoteName(this);
            sql.Write(" WHERE ");

            var generator = this.CreateSqlGenerator();
            generator.Generate(where as SqlNode);
            var whereSql = generator.Sql;
            sql.Write(whereSql.ToString());

            return dba.ExecuteText(sql.ToString(), whereSql.Parameters);
        }
Exemplo n.º 13
0
        internal int Delete(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            if (this._deleteSQL == null) { this._deleteSQL = this.GenerateDeleteSQL(); }

            var result = dba.ExecuteText(this._deleteSQL, item.Id);

            return result;
        }
Exemplo n.º 14
0
        /// <summary>
        /// 执行 sql 插入一个实体到数据库中。
        /// 基类的默认实现中,只是简单地实现了 sql 语句的生成和执行。
        /// </summary>
        /// <param name="dba"></param>
        /// <param name="item"></param>
        public virtual void Insert(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            if (this._insertSQL == null) { this._insertSQL = this.GenerateInsertSQL(); }

            var parameters = new List<object>(10);
            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (column.CanInsert)
                {
                    var value = column.ReadParameterValue(item);
                    parameters.Add(value);
                }
            }

            dba.ExecuteText(this._insertSQL, parameters.ToArray());
        }
Exemplo n.º 15
0
        public virtual int Update(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            var    parameters = new List <object>(10);
            string updateSql  = null;

            //是否有需要更新的 lob 字段。
            bool             hasUpdatedLOBColumns = false;
            List <RdbColumn> lobColumns           = null;

            if (_hasLOB)
            {
                lobColumns = new List <RdbColumn>();

                for (int i = 0, c = _columns.Count; i < c; i++)
                {
                    var column = _columns[i];
                    //如果一个 lob 属性的值存在,则表示需要更新。
                    //(可能被设置了,也可能只是简单地读取了一下,没有变更值。这时也简单地处理。)
                    if (column.IsLOB && item.FieldExists(column.Info.Property))
                    {
                        lobColumns.Add(column);
                        hasUpdatedLOBColumns = true;
                    }
                }
            }

            if (!hasUpdatedLOBColumns)
            {
                //如果没有 LOB,则直接缓存上更新语句。
                updateSql = _updateSQL.Value;
            }
            else
            {
                updateSql = this.GenerateUpdateSQL(lobColumns);
            }

            //更新所有非 lob 的字段
            for (int i = 0, c = _columns.Count; i < c; i++)
            {
                var column = _columns[i];
                if (!column.Info.IsPrimaryKey && !column.IsLOB)
                {
                    var value = column.ReadDbParameterValue(item);
                    parameters.Add(value);
                }
            }

            //更新需要更新的 lob 字段
            if (hasUpdatedLOBColumns)
            {
                for (int i = 0, c = lobColumns.Count; i < c; i++)
                {
                    var column = lobColumns[i];
                    if (!column.Info.IsPrimaryKey)
                    {
                        var value = column.ReadDbParameterValue(item);
                        parameters.Add(value);
                    }
                }
            }

            //Id 最后加入
            parameters.Add(item.Id);

            int res = dba.ExecuteText(updateSql, parameters.ToArray());

            return(res);
        }
Exemplo n.º 16
0
        /// <summary>
        /// 获取指定大小批量的连续的 Id 号。返回第一个 Id 号的值。
        /// </summary>
        /// <param name="dba">The dba.</param>
        /// <param name="table">The table.</param>
        /// <param name="size">需要连续的多少个 Id 号。</param>
        /// <returns></returns>
        private static int GetBatchIDs(IDbAccesser dba, RdbTable table, int size)
        {
            /*********************** 代码块解释 *********************************
             * 算法解释:
             * 1.先查出当前最大的 ID 值;
             * 2.计算出所需要使用的区间的起始、终止值 [start,end];
             * 3.然后设置 IDENTITY 的种子值为终止值;
             * 4.由于上两步 SQL 执行过程中有可能其它线程使用了这个 IDENTITY 而造成 [start,end] 中的值被使用,
             * 所以需要对表中的数据进行检测,如果没有被使用,才把这些 ID 值返回。
             * 如果被使用了,则上述过程重来一次即可。
             *
             * IDENTITY 的操作方法:http://www.cnblogs.com/gaizai/archive/2013/04/23/3038318.html
            **********************************************************************/

            var tableName = table.Name;

            lock (_identityLock)
            {
                while (true)
                {
                    var currentValue = Convert.ToInt32(dba.QueryValue(string.Format("SELECT IDENT_CURRENT('{0}')", tableName)));
                    var start = currentValue + 1;
                    var end = start + size - 1;
                    dba.ExecuteText(string.Format("DBCC CHECKIDENT('{0}', RESEED, {1})", tableName, end));

                    var concurrency = dba.QueryValue(string.Format(
                        "SELECT 1 WHERE EXISTS (SELECT 1 FROM {0} WHERE {1} >= {2} AND {1} <= {3})",
                        tableName, table.IdentityColumn.Name, start, end
                        ));
                    if (concurrency == null) return start;
                }
            }

            throw new InvalidOperationException("");
        }
Exemplo n.º 17
0
        public virtual void Insert(IDbAccesser dba, Entity item)
        {
            EnsureMappingTable();

            if (this._insertSQL == null) { this._insertSQL = this.GenerateInsertSQL(); }

            var parameters = new List<object>();
            foreach (RdbColumn column in _columns)
            {
                if (this.CanInsert(column))
                {
                    var value = column.ReadParameterValue(item);
                    parameters.Add(value);
                }
            }

            dba.ExecuteText(this._insertSQL, parameters.ToArray());
        }
Exemplo n.º 18
0
 protected override void RunCore(IDbAccesser db)
 {
     db.ExecuteText(this.Sql, this.Sql.Parameters);
 }