Ejemplo n.º 1
0
        public override CommandData CreateBatchInsertCommand(DataTableEntityMapping mapping, IList entitys,
                                                             bool refresh, CreateSqlState state)
        {
            if (entitys == null || entitys.Count == 0)
            {
                throw new ArgumentNullException(nameof(entitys));
            }

            IList <DataFieldMapping> fields = mapping.CreateFieldList;
            var insertLen = fields.Count;

            if (insertLen == 0)
            {
                throw new LightDataException(string.Format(SR.NotContainNonIdentityKeyFields, mapping.ObjectType));
            }

            string insertSql = null;
            string cacheKey  = null;

            if (state.Seed == 0)
            {
                cacheKey = CommandCache.CreateKey(mapping, state);
                if (_batchInsertCache.TryGetCommand(cacheKey, out var cache))
                {
                    insertSql = cache;
                }
            }

            if (insertSql == null)
            {
                var insertList = new string[insertLen];
                for (var i = 0; i < insertLen; i++)
                {
                    var field = fields[i];
                    insertList[i] = CreateDataFieldSql(field.Name);
                }

                var insert = string.Join(",", insertList);
                insertSql = $"insert into {CreateDataTableMappingSql(mapping, state)}({insert})";
                if (cacheKey != null)
                {
                    _batchInsertCache.SetCommand(cacheKey, insertSql);
                }
            }

            var totalSql = new StringBuilder();

            totalSql.AppendFormat("{0}values", insertSql);
            var cur = 0;
            var end = entitys.Count;

            foreach (var entity in entitys)
            {
                var valuesList = new string[insertLen];
                for (var i = 0; i < insertLen; i++)
                {
                    var field = fields[i];
                    var value = field.ToInsert(entity, refresh);
                    valuesList[i] = state.AddDataParameter(this, value, field.DBType, field.ObjectType);
                }

                var values = string.Join(",", valuesList);
                totalSql.Append($"({values})");
                cur++;
                totalSql.Append(cur < end ? ',' : ';');
            }

            var command = new CommandData(totalSql.ToString());

            return(command);
        }
Ejemplo n.º 2
0
        public override CommandData CreateBatchInsertWithIdentityCommand(DataTableEntityMapping mapping, IList entitys,
                                                                         bool refresh, CreateSqlState state)
        {
            if (entitys == null || entitys.Count == 0)
            {
                throw new ArgumentNullException(nameof(entitys));
            }

            IList <DataFieldMapping> fields = mapping.CreateFieldList;
            var insertLen = fields.Count;

            if (insertLen == 0)
            {
                throw new LightDataException(string.Format(SR.NotContainNonIdentityKeyFields, mapping.ObjectType));
            }

            if (!mapping.HasIdentity)
            {
                throw new LightDataException(string.Format(SR.NoIdentityField, mapping.ObjectType));
            }

            string insertSql = null;
            string cacheKey  = null;

            if (state.Seed == 0)
            {
                cacheKey = CommandCache.CreateKey(mapping, state);
                if (_batchInsertCache.TryGetCommand(cacheKey, out var cache))
                {
                    insertSql = cache;
                }
            }

            if (insertSql == null)
            {
                var insertList = new string[insertLen];
                for (var i = 0; i < insertLen; i++)
                {
                    var field = fields[i];
                    insertList[i] = CreateDataFieldSql(field.Name);
                }

                var insert = string.Join(",", insertList);
                insertSql = $"insert into {CreateDataTableMappingSql(mapping, state)}({insert})";
                if (cacheKey != null)
                {
                    _batchInsertCache.SetCommand(cacheKey, insertSql);
                }
            }

            var totalSql = new StringBuilder();

            totalSql.Append("drop temporary table if exists `temptb`;create temporary table `temptb`(`id` int(11));");

            foreach (var entity in entitys)
            {
                var valuesList = new string[insertLen];
                for (var i = 0; i < insertLen; i++)
                {
                    var field = fields[i];
                    var value = field.ToInsert(entity, refresh);
                    valuesList[i] = state.AddDataParameter(this, value, field.DBType, field.ObjectType);
                }

                var values = string.Join(",", valuesList);
                totalSql.Append($"{insertSql}values({values});insert into `temptb`(`id`) select last_insert_id();");
            }

            totalSql.Append("select `id` from `temptb`;");
            var command = new CommandData(totalSql.ToString());

            return(command);
        }
        public override CommandData CreateBaseInsertCommand(DataTableEntityMapping mapping, object entity, bool refresh,
                                                            bool updateIdentity, CreateSqlState state)
        {
            string cacheKey = null;
            var    identity = updateIdentity && mapping.HasIdentity;

            if (state.Seed == 0 && !state.UseDirectNull)
            {
                cacheKey = CommandCache.CreateKey(mapping, state);
                if (identity)
                {
                    cacheKey = string.Concat(cacheKey, "|id");
                }

                if (_baseInsertCache.TryGetCommand(cacheKey, out var cache))
                {
                    var command1 = new CommandData(cache)
                    {
                        IdentitySql = identity
                    };
                    foreach (var field in mapping.CreateFieldList)
                    {
                        var value = field.ToInsert(entity, refresh);
                        state.AddDataParameter(this, value, field.DBType, field.ObjectType);
                    }

                    return(command1);
                }
            }

            IList <DataFieldMapping> fields = mapping.CreateFieldList;
            var insertLen = fields.Count;

            if (insertLen == 0)
            {
                throw new LightDataException(string.Format(SR.NotContainNonIdentityKeyFields, mapping.ObjectType));
            }

            var insertList = new string[insertLen];
            var valuesList = new string[insertLen];

            for (var i = 0; i < insertLen; i++)
            {
                var field = fields[i];
                var value = field.ToInsert(entity, refresh);
                insertList[i] = CreateDataFieldSql(field.Name);
                valuesList[i] = state.AddDataParameter(this, value, field.DBType, field.ObjectType);
            }

            var insert = string.Join(",", insertList);
            var values = string.Join(",", valuesList);
            var sql    = identity
                ? $"insert into {CreateDataTableMappingSql(mapping, state)}({insert}) output inserted.{CreateDataFieldSql(mapping.IdentityField.Name)} values({values})"
                : $"insert into {CreateDataTableMappingSql(mapping, state)}({insert})values({values})";

            var command = new CommandData(sql)
            {
                IdentitySql = identity
            };

            if (cacheKey != null)
            {
                _baseInsertCache.SetCommand(cacheKey, command.CommandText);
            }

            return(command);
        }
Ejemplo n.º 4
0
        public override CommandData CreateBatchInsertWithIdentityCommand(DataTableEntityMapping mapping, IList entitys, bool refresh, CreateSqlState state)
        {
            if (entitys == null || entitys.Count == 0)
            {
                throw new ArgumentNullException(nameof(entitys));
            }
            int totalCount = entitys.Count;
            IList <DataFieldMapping> fields = mapping.CreateFieldList;
            int insertLen = fields.Count;

            if (insertLen == 0)
            {
                throw new LightDataException(string.Format(SR.NotContainNonIdentityKeyFields, mapping.ObjectType));
            }
            if (!mapping.HasIdentity)
            {
                throw new LightDataException(string.Format(SR.NoIdentityField, mapping.ObjectType));
            }
            string insertSql = null;
            string cachekey  = null;

            if (state.Seed == 0)
            {
                cachekey = CommandCache.CreateKey(mapping, state);
                if (_batchInsertCache.TryGetCommand(cachekey, out string cache))
                {
                    insertSql = cache;
                }
            }
            if (insertSql == null)
            {
                string[] insertList = new string[insertLen];
                for (int i = 0; i < insertLen; i++)
                {
                    DataFieldMapping field = fields[i];
                    insertList[i] = CreateDataFieldSql(field.Name);
                }
                string insert = string.Join(",", insertList);
                insertSql = string.Format("insert into {0}({1})", CreateDataTableMappingSql(mapping, state), insert);
                if (cachekey != null)
                {
                    _batchInsertCache.SetCommand(cachekey, insertSql);
                }
            }
            StringBuilder totalSql = new StringBuilder();

            totalSql.AppendFormat("{0}values", insertSql);
            int cur = 0;
            int end = entitys.Count;

            foreach (object entity in entitys)
            {
                string[] valuesList = new string[insertLen];
                for (int i = 0; i < insertLen; i++)
                {
                    DataFieldMapping field = fields[i];
                    object           value = field.GetInsertData(entity, refresh);
                    valuesList[i] = state.AddDataParameter(this, value, field.DBType, field.ObjectType);
                }
                string values = string.Join(",", valuesList);
                totalSql.AppendFormat("({0})", values);
                cur++;
                if (cur < end)
                {
                    totalSql.Append(',');
                }
                else
                {
                    totalSql.AppendFormat("returning {0} as id;", CreateDataFieldSql(mapping.IdentityField.Name));
                }
            }
            CommandData command = new CommandData(totalSql.ToString());

            return(command);
        }
Ejemplo n.º 5
0
        public override CommandData CreateBaseInsertCommand(DataTableEntityMapping mapping, object entity, bool refresh, bool updateIdentity, CreateSqlState state)
        {
            string cachekey = null;
            bool   identity = updateIdentity && mapping.HasIdentity;

            if (state.Seed == 0 && !state.UseDirectNull)
            {
                cachekey = CommandCache.CreateKey(mapping, state);
                if (identity)
                {
                    cachekey = string.Concat(cachekey, "|id");
                }
                if (_baseInsertCache.TryGetCommand(cachekey, out string cache))
                {
                    CommandData command1 = new CommandData(cache);
                    command1.IdentitySql = identity;
                    foreach (DataFieldMapping field in mapping.CreateFieldList)
                    {
                        object value = field.GetInsertData(entity, refresh);
                        state.AddDataParameter(this, value, field.DBType, field.ObjectType);
                    }
                    return(command1);
                }
            }

            IList <DataFieldMapping> fields = mapping.CreateFieldList;
            int insertLen = fields.Count;

            if (insertLen == 0)
            {
                throw new LightDataException(string.Format(SR.NotContainNonIdentityKeyFields, mapping.ObjectType));
            }

            string[] insertList = new string[insertLen];
            string[] valuesList = new string[insertLen];
            for (int i = 0; i < insertLen; i++)
            {
                DataFieldMapping field = fields[i];
                object           value = field.GetInsertData(entity, refresh);
                insertList[i] = CreateDataFieldSql(field.Name);
                valuesList[i] = state.AddDataParameter(this, value, field.DBType, field.ObjectType);
            }
            string insert = string.Join(",", insertList);
            string values = string.Join(",", valuesList);
            string sql;

            if (identity)
            {
                sql = string.Format("insert into {0}({1}) output inserted.{3} values({2})", CreateDataTableMappingSql(mapping, state), insert, values, CreateDataFieldSql(mapping.IdentityField.Name));
            }
            else
            {
                sql = string.Format("insert into {0}({1})values({2})", CreateDataTableMappingSql(mapping, state), insert, values);
            }

            CommandData command = new CommandData(sql);

            command.IdentitySql = identity;
            if (cachekey != null)
            {
                _baseInsertCache.SetCommand(cachekey, command.CommandText);
            }
            return(command);
        }