示例#1
0
        public override void Insert(IDbAccesser dba, Entity item)
        {
            var idColumn = this.IdentityColumn;
            if (idColumn != null)
            {
                if (_selectSEQSql == null)
                {
                    var seqName = new StringWriter();
                    seqName.Write("SEQ_");
                    this.AppendPrepare(seqName, this.Name);
                    seqName.Write('_');
                    this.AppendPrepare(seqName, idColumn.Name);
                    var seqNameValue = Rafy.DbMigration.Oracle.OracleMigrationProvider.LimitOracleIdentifier(seqName.ToString());

                    //此序列是由 DbMigration 中自动生成的。
                    _selectSEQSql = string.Format(@"SELECT {0} .nextval from dual", seqNameValue);
                }
                //由于默认可能不是 int 类型,所以需要类型转换。
                var value = dba.RawAccesser.QueryValue(_selectSEQSql);
                value = TypeHelper.CoerceValue(item.KeyProvider.KeyType, value);
                idColumn.LoadValue(item, value);

                //如果实体的 Id 是在插入的过程中生成的,
                //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。
                item.SyncIdToChildren();
            }

            base.Insert(dba, item);
        }
示例#2
0
        public override void Insert(IDbAccesser dba, Entity item)
        {
            base.Insert(dba, item);

            var idColumn = this.IdentityColumn;
            if (idColumn != null)
            {
                //由于默认是 decimal 类型,所以需要类型转换。
                var value = dba.RawAccesser.QueryValue("SELECT @@IDENTITY;");
                value = TypeHelper.CoerceValue(item.KeyProvider.KeyType, value);
                idColumn.LoadValue(item, value);

                //如果实体的 Id 是在插入的过程中生成的,
                //那么需要在插入组合子对象前,先把新生成的父对象 Id 都同步到子列表中。
                item.SyncIdToChildren();
            }
        }
示例#3
0
        public override void Insert(IDbAccesser dba, Entity item)
        {
            //如果有 Id 列,那么需要在执行 Insert 的同时,执行 SELECT @@IDENTITY。
            //在为 SQL Server 插入数据时,执行 Insert 的同时,必须同时执行 SELECT @@IDENTITY。否则会有多线程问题。
            var idColumn = this.IdentityColumn;
            if (idColumn != null)
            {
                if (_insertSQL == null)
                {
                    _insertSQL = this.GenerateInsertSQL();
                    _insertSQL += Environment.NewLine;
                    _insertSQL += "SELECT @@IDENTITY;";
                }

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

                //由于默认是 decimal 类型,所以需要类型转换。
                var idValue = dba.QueryValue(this._insertSQL, parameters.ToArray());
                idValue = TypeHelper.CoerceValue(item.KeyProvider.KeyType, idValue);
                idColumn.LoadValue(item, idValue);

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