예제 #1
0
        protected override BulkCopyRowsCopied MultipleRowsCopy <T>(
            ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
        {
            BulkCopyRowsCopied ret;

            var helper = new MultipleRowsHelper <T>(table, options);

            if (options.KeepIdentity == true)
            {
                helper.DataConnection.Execute("SET IDENTITY_INSERT " + helper.TableName + " ON");
            }

            switch (((SqlServerDataProvider)helper.DataConnection.DataProvider).Version)
            {
            case SqlServerVersion.v2000:
            case SqlServerVersion.v2005: ret = MultipleRowsCopy2(helper, source, ""); break;

            default: ret = MultipleRowsCopy1(helper, source);     break;
            }

            if (options.KeepIdentity == true)
            {
                helper.DataConnection.Execute("SET IDENTITY_INSERT " + helper.TableName + " OFF");
            }

            return(ret);
        }
예제 #2
0
        static BulkCopyRowsCopied OracleMultipleRowsCopy3(MultipleRowsHelper helper, IEnumerable source)
        {
            helper.StringBuilder
            .AppendFormat("INSERT INTO {0}", helper.TableName).AppendLine()
            .Append("(");

            foreach (var column in helper.Columns)
            {
                helper.StringBuilder
                .AppendLine()
                .Append("\t")
                .Append(helper.SqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                .Append(",");
            }

            helper.StringBuilder.Length--;
            helper.StringBuilder
            .AppendLine()
            .AppendLine(")")
            ;

            helper.SetHeader();

            foreach (var item in source)
            {
                helper.StringBuilder
                .AppendLine()
                .Append("\tSELECT ");
                helper.BuildColumns(item, _ => _.DataType == DataType.Text || _.DataType == DataType.NText);
                helper.StringBuilder.Append(" FROM DUAL ");
                helper.StringBuilder.Append(" UNION ALL");

                helper.RowsCopied.RowsCopied++;
                helper.CurrentCount++;

                if (helper.CurrentCount >= helper.BatchSize || helper.Parameters.Count > 10000 || helper.StringBuilder.Length > 100000)
                {
                    helper.StringBuilder.Length -= " UNION ALL".Length;
                    helper.StringBuilder
                    .AppendLine()
                    ;
                    if (!helper.Execute())
                    {
                        return(helper.RowsCopied);
                    }
                }
            }

            if (helper.CurrentCount > 0)
            {
                helper.StringBuilder.Length -= " UNION ALL".Length;
                helper.StringBuilder
                .AppendLine()
                ;
                helper.Execute();
            }

            return(helper.RowsCopied);
        }
예제 #3
0
        BulkCopyRowsCopied MultipleRowsCopy2 <T>(
            DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            var helper = new MultipleRowsHelper <T>(dataConnection, options, options.KeepIdentity ?? false);

            helper.StringBuilder.AppendFormat("INSERT INTO {0} (", helper.TableName);

            foreach (var column in helper.Columns)
            {
                helper.StringBuilder
                .Append(helper.SqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                .Append(", ");
            }

            helper.StringBuilder.Length -= 2;

            helper.StringBuilder.Append(") VALUES (");

            for (var i = 0; i < helper.Columns.Length; i++)
            {
                helper.StringBuilder.Append(":p" + (i + 1)).Append(", ");
            }

            helper.StringBuilder.Length -= 2;

            helper.StringBuilder.AppendLine(")");
            helper.SetHeader();

            var list = new List <T>(31);

            foreach (var item in source)
            {
                list.Add(item);

                helper.RowsCopied.RowsCopied++;
                helper.CurrentCount++;

                if (helper.CurrentCount >= helper.BatchSize)
                {
                    if (!Execute(dataConnection, helper, list))
                    {
                        return(helper.RowsCopied);
                    }

                    list.Clear();
                }
            }

            if (helper.CurrentCount > 0)
            {
                Execute(dataConnection, helper, list);
            }

            return(helper.RowsCopied);
        }
예제 #4
0
        static BulkCopyRowsCopied OracleMultipleRowsCopy2(MultipleRowsHelper helper, IEnumerable source)
        {
            helper.StringBuilder.AppendFormat("INSERT INTO {0} (", helper.TableName);

            foreach (var column in helper.Columns)
            {
                helper.StringBuilder
                .Append(helper.SqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                .Append(", ");
            }

            helper.StringBuilder.Length -= 2;

            helper.StringBuilder.Append(") VALUES (");

            for (var i = 0; i < helper.Columns.Length; i++)
            {
                helper.StringBuilder.Append(":p" + (i + 1)).Append(", ");
            }

            helper.StringBuilder.Length -= 2;

            helper.StringBuilder.AppendLine(")");
            helper.SetHeader();

            var list = new List <object>(31);

            foreach (var item in source)
            {
                list.Add(item);

                helper.RowsCopied.RowsCopied++;
                helper.CurrentCount++;

                if (helper.CurrentCount >= helper.BatchSize)
                {
                    if (!Execute(helper, list))
                    {
                        return(helper.RowsCopied);
                    }

                    list.Clear();
                }
            }

            if (helper.CurrentCount > 0)
            {
                Execute(helper, list);
            }

            return(helper.RowsCopied);
        }
예제 #5
0
        protected override BulkCopyRowsCopied MultipleRowsCopy <T>(
            DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            var helper = new MultipleRowsHelper <T>(dataConnection, options, false);

            helper.StringBuilder.AppendLine("INSERT ALL");
            helper.SetHeader();

            foreach (var item in source)
            {
                helper.StringBuilder.AppendFormat("\tINTO {0} (", helper.TableName);

                foreach (var column in helper.Columns)
                {
                    helper.StringBuilder
                    .Append(helper.SqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                    .Append(", ");
                }

                helper.StringBuilder.Length -= 2;

                helper.StringBuilder.Append(") VALUES (");
                helper.BuildColumns(item);
                helper.StringBuilder.AppendLine(")");

                helper.RowsCopied.RowsCopied++;
                helper.CurrentCount++;

                if (helper.CurrentCount >= helper.BatchSize || helper.Parameters.Count > 10000 ||
                    helper.StringBuilder.Length > 100000)
                {
                    helper.StringBuilder.AppendLine("SELECT * FROM dual");
                    if (!helper.Execute())
                    {
                        return(helper.RowsCopied);
                    }
                }
            }

            if (helper.CurrentCount > 0)
            {
                helper.StringBuilder.AppendLine("SELECT * FROM dual");
                helper.Execute();
            }

            return(helper.RowsCopied);
        }
예제 #6
0
        static bool Execute(MultipleRowsHelper helper, List <object> list)
        {
            for (var i = 0; i < helper.Columns.Length; i++)
            {
                var column   = helper.Columns[i];
                var dataType = column.DataType == DataType.Undefined
                                        ? helper.DataConnection.MappingSchema.GetDataType(column.MemberType).Type.DataType
                                        : column.DataType;

                helper.Parameters.Add(new DataParameter(":p" + (i + 1), list.Select(o => column.GetValue(helper.DataConnection.MappingSchema, o)).ToArray(), dataType, column.DbType)
                {
                    Direction = ParameterDirection.Input,
                    IsArray   = true,
                });
            }

            return(helper.Execute());
        }
예제 #7
0
        bool Execute <T>(DataConnection dataConnection, MultipleRowsHelper <T> helper, List <T> list)
        {
            for (var i = 0; i < helper.Columns.Length; i++)
            {
                var column   = helper.Columns[i];
                var dataType = column.DataType == DataType.Undefined
                                        ? dataConnection.MappingSchema.GetDataType(column.MemberType).DataType
                                        : column.DataType;
                //var type     = dataConnection.DataProvider.ConvertParameterType(column.MemberType, dataType);

                helper.Parameters.Add(new DataParameter(":p" + (i + 1), list.Select(o => column.GetValue(o)).ToArray(), dataType)
                {
                    Direction = ParameterDirection.Input,
                    IsArray   = true,
                });
            }

            return(helper.Execute());
        }
예제 #8
0
        protected override BulkCopyRowsCopied MultipleRowsCopy <T>(
            ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
        {
            var helper = new MultipleRowsHelper <T>(table, options);

            if (options.KeepIdentity == true)
            {
                helper.DataConnection.Execute("SET IDENTITY_INSERT " + helper.TableName + " ON");
            }

            var ret = MultipleRowsCopy2(helper, source, "");

            if (options.KeepIdentity == true)
            {
                helper.DataConnection.Execute("SET IDENTITY_INSERT " + helper.TableName + " OFF");
            }

            return(ret);
        }
예제 #9
0
        protected override async Task <BulkCopyRowsCopied> MultipleRowsCopyAsync <T>(
            ITable <T> table, BulkCopyOptions options, IAsyncEnumerable <T> source, CancellationToken cancellationToken)
        {
            var helper = new MultipleRowsHelper <T>(table, options);

            if (options.KeepIdentity == true)
            {
                await helper.DataConnection.ExecuteAsync("SET IDENTITY_INSERT " + helper.TableName + " ON", cancellationToken)
                .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
            }

            var ret = await MultipleRowsCopy2Async(helper, source, "", cancellationToken)
                      .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);

            if (options.KeepIdentity == true)
            {
                await helper.DataConnection.ExecuteAsync("SET IDENTITY_INSERT " + helper.TableName + " OFF", cancellationToken)
                .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
            }

            return(ret);
        }
예제 #10
0
        protected override async Task <BulkCopyRowsCopied> MultipleRowsCopyAsync <T>(
            ITable <T> table, BulkCopyOptions options, IAsyncEnumerable <T> source, CancellationToken cancellationToken)
        {
            BulkCopyRowsCopied ret;

            var helper = new MultipleRowsHelper <T>(table, options);

            if (options.KeepIdentity == true)
            {
                await helper.DataConnection.ExecuteAsync("SET IDENTITY_INSERT " + helper.TableName + " ON", cancellationToken)
                .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
            }

            switch (((SqlServerDataProvider)helper.DataConnection.DataProvider).Version)
            {
            case SqlServerVersion.v2000:
            case SqlServerVersion.v2005:
                ret = await MultipleRowsCopy2Async(helper, source, "", cancellationToken)
                      .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);

                break;

            default:
                ret = await MultipleRowsCopy1Async(helper, source, cancellationToken)
                      .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);

                break;
            }

            if (options.KeepIdentity == true)
            {
                await helper.DataConnection.ExecuteAsync("SET IDENTITY_INSERT " + helper.TableName + " OFF", cancellationToken)
                .ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
            }

            return(ret);
        }