Ejemplo n.º 1
0
 protected override BulkCopyRowsCopied MultipleRowsCopy <T>(ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(MultipleRowsCopy1(table, options, source));
 }
 BulkCopyRowsCopied IDataProvider.BulkCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 3
0
        protected virtual BulkCopyRowsCopied RowByRowCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            var rowsCopied = new BulkCopyRowsCopied();

            foreach (var item in source)
            {
                dataConnection.Insert(item, options.TableName, options.DatabaseName, options.SchemaName);
                rowsCopied.RowsCopied++;

                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null && rowsCopied.RowsCopied % options.NotifyAfter == 0)
                {
                    options.RowsCopiedCallback(rowsCopied);

                    if (rowsCopied.Abort)
                    {
                        break;
                    }
                }
            }

            return(rowsCopied);
        }
Ejemplo n.º 4
0
 protected override BulkCopyRowsCopied MultipleRowsCopy <T>(
     DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(MultipleRowsCopy2(dataConnection, options, false, source, ""));
 }
Ejemplo n.º 5
0
        public virtual BulkCopyRowsCopied BulkCopy <T>(BulkCopyType bulkCopyType, DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            switch (bulkCopyType)
            {
            case BulkCopyType.MultipleRows: return(MultipleRowsCopy(dataConnection, options, source));

            case BulkCopyType.RowByRow: return(RowByRowCopy(dataConnection, options, source));

            default: return(ProviderSpecificCopy(dataConnection, options, source));
            }
        }
Ejemplo n.º 6
0
 protected virtual BulkCopyRowsCopied MultipleRowsCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(RowByRowCopy(dataConnection, options, source));
 }
Ejemplo n.º 7
0
        private async Task <BulkCopyRowsCopied> ProviderSpecificCopyInternal <T>(
            ProviderConnections providerConnections,
            ITable <T> table,
            BulkCopyOptions options,
            Func <List <Mapping.ColumnDescriptor>, BulkCopyReader <T> > createDataReader,
            bool runAsync,
            CancellationToken cancellationToken)
        {
            var dataConnection = providerConnections.DataConnection;
            var connection     = providerConnections.ProviderConnection;
            var transaction    = providerConnections.ProviderTransaction;
            var ed             = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
            var columns        = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
            var sb             = _provider.CreateSqlBuilder(dataConnection.MappingSchema);
            var rd             = createDataReader(columns);
            var sqlopt         = SqlServerProviderAdapter.SqlBulkCopyOptions.Default;
            var rc             = new BulkCopyRowsCopied();

            if (options.CheckConstraints == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.CheckConstraints;
            }
            if (options.KeepIdentity == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.KeepIdentity;
            }
            if (options.TableLock == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.TableLock;
            }
            if (options.KeepNulls == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.KeepNulls;
            }
            if (options.FireTriggers == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.FireTriggers;
            }
            if (options.UseInternalTransaction == true)
            {
                sqlopt |= SqlServerProviderAdapter.SqlBulkCopyOptions.UseInternalTransaction;
            }

            using (var bc = _provider.Adapter.CreateBulkCopy(connection, sqlopt, transaction))
            {
                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                {
                    bc.NotifyAfter = options.NotifyAfter;

                    bc.SqlRowsCopied += (sender, args) =>
                    {
                        rc.RowsCopied = args.RowsCopied;
                        options.RowsCopiedCallback(rc);
                        if (rc.Abort)
                        {
                            args.Abort = true;
                        }
                    };
                }

                if (options.MaxBatchSize.HasValue)
                {
                    bc.BatchSize = options.MaxBatchSize.Value;
                }

                if (options.BulkCopyTimeout.HasValue)
                {
                    bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                }
                else if (Common.Configuration.Data.BulkCopyUseConnectionCommandTimeout)
                {
                    bc.BulkCopyTimeout = connection.ConnectionTimeout;
                }

                var tableName = GetTableName(sb, options, table);

                bc.DestinationTableName = tableName;

                for (var i = 0; i < columns.Count; i++)
                {
                    bc.ColumnMappings.Add(_provider.Adapter.CreateBulkCopyColumnMapping(i, sb.ConvertInline(columns[i].ColumnName, ConvertType.NameToQueryField)));
                }

                await TraceActionAsync(
                    dataConnection,
                    () => (runAsync ? "INSERT ASYNC BULK " : "INSERT BULK ") + tableName + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + ")" + Environment.NewLine,
                    async() => {
                    if (runAsync)
                    {
                        await bc.WriteToServerAsync(rd, cancellationToken).ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
                    }
                    else
                    {
                        bc.WriteToServer(rd);
                    }
                    return(rd.Count);
                }).ConfigureAwait(Common.Configuration.ContinueOnCapturedContext);
            }

            if (rc.RowsCopied != rd.Count)
            {
                rc.RowsCopied = rd.Count;

                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                {
                    options.RowsCopiedCallback(rc);
                }
            }

            return(rc);
        }
Ejemplo n.º 8
0
        protected virtual BulkCopyRowsCopied RowByRowCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            // This limitation could be lifted later for some providers that supports identity insert if we will get such request
            // It will require support from DataConnection.Insert
            if (options.KeepIdentity == true)
            {
                throw new LinqToDBException($"{nameof(BulkCopyOptions)}.{nameof(BulkCopyOptions.KeepIdentity)} = true is not supported by {nameof(BulkCopyType)}.{nameof(BulkCopyType.RowByRow)} mode");
            }

            var rowsCopied = new BulkCopyRowsCopied();

            foreach (var item in source)
            {
                dataConnection.Insert(item, options.TableName, options.DatabaseName, options.SchemaName);
                rowsCopied.RowsCopied++;

                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null && rowsCopied.RowsCopied % options.NotifyAfter == 0)
                {
                    options.RowsCopiedCallback(rowsCopied);

                    if (rowsCopied.Abort)
                    {
                        break;
                    }
                }
            }

            return(rowsCopied);
        }
Ejemplo n.º 9
0
 /// <summary>
 /// SqlServer大数据复制
 /// </summary>
 /// <param name="dr">数据源</param>
 /// <param name="tableName">对应的表名</param>
 /// <param name="dbkey">数据库</param>
 /// <param name="options">选项 默认Default</param>
 /// <param name="isTran">是否使用事务 默认false</param>
 /// <param name="timeout">超时时间7200 2小时</param>
 /// <param name="batchSize">每一批次中的行数</param>
 /// <param name="error">错误处理</param>
 /// <returns>true/false</returns>
 public bool DataBulkCopy(IDataReader dr, string tableName, string dbkey = "", BulkCopyOptions options = BulkCopyOptions.Default, bool isTran = false, int timeout = 7200, int batchSize = 10000, Action<Exception> error = null) {
     if (Data.Pool(dbkey).DBType != "SqlServer") return false;
     SqlTransaction tran = null;
     using(SqlConnection conn = new SqlConnection(Data.Pool(dbkey).ConnString)) {
         if (isTran) tran = conn.BeginTransaction();
         using (System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(conn, ((int)options).ToEnum<SqlBulkCopyOptions>(), tran)) {
             bc.BulkCopyTimeout = timeout;
             bc.BatchSize = batchSize;
             bc.DestinationTableName = tableName;
             try {
                 bc.WriteToServer(dr);
                 if (isTran) tran.Commit();
             } catch(Exception ex) {
                 if (isTran) tran.Rollback();
                 if (error.IsNotNull()) error(ex);
                 return false;
             }
         }
     }
     return true;
 }
Ejemplo n.º 10
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            [JetBrains.Annotations.NotNull] ITable <T> table,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (!(table?.DataContext is DataConnection dataConnection))
            {
                throw new ArgumentNullException(nameof(dataConnection));
            }

            if (dataConnection.Transaction == null)
            {
                var sqlBuilder = dataConnection.DataProvider.CreateSqlBuilder(dataConnection.MappingSchema);
                var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                var tableName  = GetTableName(sqlBuilder, options, table);

                if (_bulkCopyCreator == null)
                {
                    var bulkCopyType       = _connectionType.AssemblyEx().GetType("IBM.Data.DB2.DB2BulkCopy", false);
                    var bulkCopyOptionType = _connectionType.AssemblyEx().GetType("IBM.Data.DB2.DB2BulkCopyOptions", false);
                    var columnMappingType  = _connectionType.AssemblyEx().GetType("IBM.Data.DB2.DB2BulkCopyColumnMapping", false);

                    if (bulkCopyType != null)
                    {
                        _bulkCopyCreator      = CreateBulkCopyCreator(_connectionType, bulkCopyType, bulkCopyOptionType);
                        _columnMappingCreator = CreateColumnMappingCreator(columnMappingType);
                    }
                }

                if (_bulkCopyCreator != null)
                {
                    var columns = descriptor.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                    var rd      = new BulkCopyReader(dataConnection.DataProvider, dataConnection.MappingSchema, columns, source);
                    var rc      = new BulkCopyRowsCopied();

                    var bcOptions = 0;                     // Default

                    if (options.KeepIdentity == true)
                    {
                        bcOptions |= 1;                                                   // KeepIdentity = 1, TableLock = 2, Truncate = 4,
                    }
                    if (options.TableLock == true)
                    {
                        bcOptions |= 2;
                    }

                    using (var bc = _bulkCopyCreator(Proxy.GetUnderlyingObject((DbConnection)dataConnection.Connection), bcOptions))
                    {
                        dynamic dbc = bc;

                        var notifyAfter = options.NotifyAfter == 0 && options.MaxBatchSize.HasValue ?
                                          options.MaxBatchSize.Value : options.NotifyAfter;

                        if (notifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            if (_bulkCopySubscriber == null)
                            {
                                _bulkCopySubscriber = CreateBulkCopySubscriber(bc, "DB2RowsCopied");
                            }

                            dbc.NotifyAfter = notifyAfter;

                            _bulkCopySubscriber(bc, arg =>
                            {
                                dynamic darg  = arg;
                                rc.RowsCopied = darg.RowsCopied;
                                options.RowsCopiedCallback(rc);
                                if (rc.Abort)
                                {
                                    darg.Abort = true;
                                }
                            });
                        }

                        if (options.BulkCopyTimeout.HasValue)
                        {
                            dbc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                        }

                        dbc.DestinationTableName = tableName;

                        for (var i = 0; i < columns.Count; i++)
                        {
                            dbc.ColumnMappings.Add((dynamic)_columnMappingCreator(i, columns[i].ColumnName));
                        }

                        TraceAction(
                            dataConnection,
                            () => "INSERT BULK " + tableName + Environment.NewLine,
                            () => { dbc.WriteToServer(rd); return(rd.Count); });
                    }

                    if (rc.RowsCopied != rd.Count)
                    {
                        rc.RowsCopied = rd.Count;

                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            options.RowsCopiedCallback(rc);
                        }
                    }

                    return(rc);
                }
            }

            return(MultipleRowsCopy(table, options, source));
        }
Ejemplo n.º 11
0
 /// <summary>
 /// 大数据复制
 /// </summary>
 /// <param name="conn">连接源</param>
 /// <param name="tran">事务</param>
 /// <param name="dt">数据源 dt.TableName一定要和数据库表名对应</param>
 /// <param name="options">选项 默认Default</param>
 /// <param name="timeout">超时时间7200 2小时</param>
 /// <param name="batchSize">每一批次中的行数</param>
 /// <param name="error">错误处理</param>
 /// <returns></returns>
 public bool DataBulkCopy(IDbConnection conn, IDbTransaction tran, DataTable dt, BulkCopyOptions options = BulkCopyOptions.Default, int timeout = 7200, int batchSize = 10000, Action<Exception> error = null) {
     using (System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy((SqlConnection)conn, ((int)options).ToEnum<SqlBulkCopyOptions>(), (SqlTransaction)tran)) {
         bc.BulkCopyTimeout = timeout;
         bc.BatchSize = batchSize;
         bc.DestinationTableName = dt.TableName;
         try {
             bc.WriteToServer(dt);
         } catch(Exception ex) {
             if (error.IsNotNull()) error(ex);
             return false;
         }
     }
     return true;
 }
Ejemplo n.º 12
0
        protected override BulkCopyRowsCopied MultipleRowsCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            var sqlBuilder = _dataProvider.CreateSqlBuilder();
            var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
            var tableName  = GetTableName(sqlBuilder, descriptor);
            var iszOS      = _dataProvider.Version == DB2Version.zOS;
            var rowsCopied = new BulkCopyRowsCopied();
            var sb         = new StringBuilder();
            var buildValue = BasicSqlBuilder.GetBuildValue(sqlBuilder, sb);
            var columns    = descriptor.Columns.Where(c => !c.SkipOnInsert).ToArray();
            var pname      = sqlBuilder.Convert("p", ConvertType.NameToQueryParameter).ToString();

            sb
            .AppendFormat("INSERT INTO {0}", tableName).AppendLine()
            .Append("(");

            foreach (var column in columns)
            {
                sb
                .AppendLine()
                .Append("\t")
                .Append(sqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                .Append(",");
            }

            sb.Length--;
            sb
            .AppendLine()
            .Append(")");

            if (!iszOS)
            {
                sb
                .AppendLine()
                .Append("VALUES");
            }

            var headerLen    = sb.Length;
            var currentCount = 0;
            var batchSize    = options.MaxBatchSize ?? 1000;

            if (batchSize <= 0)
            {
                batchSize = 1000;
            }

            var parms = new List <DataParameter>();
            var pidx  = 0;

            foreach (var item in source)
            {
                sb
                .AppendLine()
                .Append(iszOS ? "SELECT " : "(");

                foreach (var column in columns)
                {
                    var value = column.GetValue(item);

                    if (value == null)
                    {
                        sb.Append("NULL");
                    }
                    else
                    {
                        switch (Type.GetTypeCode(value.GetType()))
                        {
                        case TypeCode.DBNull:
                            sb.Append("NULL");
                            break;

                        case TypeCode.String:
                            var isString = false;

                            switch (column.DataType)
                            {
                            case DataType.NVarChar:
                            case DataType.Char:
                            case DataType.VarChar:
                            case DataType.NChar:
                            case DataType.Undefined:
                                isString = true;
                                break;
                            }

                            if (isString)
                            {
                                goto case TypeCode.Int32;
                            }
                            goto default;

                        case TypeCode.Boolean:
                        case TypeCode.Char:
                        case TypeCode.SByte:
                        case TypeCode.Byte:
                        case TypeCode.Int16:
                        case TypeCode.UInt16:
                        case TypeCode.Int32:
                        case TypeCode.UInt32:
                        case TypeCode.Int64:
                        case TypeCode.UInt64:
                        case TypeCode.Single:
                        case TypeCode.Double:
                        case TypeCode.Decimal:
                        case TypeCode.DateTime:
                            //SetParameter(dataParam, "", column.DataType, value);

                            buildValue(value);
                            break;

                        default:
                            var name = pname + ++pidx;

                            sb.Append(name);
                            parms.Add(new DataParameter("p" + pidx, value, column.DataType));

                            break;
                        }
                    }

                    sb.Append(",");
                }

                sb.Length--;
                sb.Append(iszOS ? " FROM SYSIBM.SYSDUMMY1 UNION ALL" : "),");

                rowsCopied.RowsCopied++;
                currentCount++;

                if (currentCount >= batchSize || parms.Count > 100000 || sb.Length > 100000)
                {
                    if (iszOS)
                    {
                        sb.Length -= " UNION ALL".Length;
                    }
                    else
                    {
                        sb.Length--;
                    }

                    dataConnection.Execute(sb.AppendLine().ToString(), parms.ToArray());

                    if (options.RowsCopiedCallback != null)
                    {
                        options.RowsCopiedCallback(rowsCopied);

                        if (rowsCopied.Abort)
                        {
                            return(rowsCopied);
                        }
                    }

                    parms.Clear();
                    pidx         = 0;
                    currentCount = 0;
                    sb.Length    = headerLen;
                }
            }

            if (currentCount > 0)
            {
                if (iszOS)
                {
                    sb.Length -= " UNION ALL".Length;
                }
                else
                {
                    sb.Length--;
                }

                dataConnection.Execute(sb.ToString(), parms.ToArray());
                sb.Length = headerLen;

                if (options.RowsCopiedCallback != null)
                {
                    options.RowsCopiedCallback(rowsCopied);
                }
            }

            return(rowsCopied);
        }
Ejemplo n.º 13
0
 public virtual BulkCopyRowsCopied BulkCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(new BasicBulkCopy().BulkCopy(options.BulkCopyType, dataConnection, options, source));
 }
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            DataConnection dataConnection,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (dataConnection == null)
            {
                throw new ArgumentNullException("dataConnection");
            }

            if (dataConnection.Transaction == null)
            {
                var sqlBuilder = dataConnection.DataProvider.CreateSqlBuilder();
                var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                var tableName  = GetTableName(sqlBuilder, options, descriptor);
                if (_bulkCopyCreator == null)
                {
                    throw new NotImplementedException("Not able to do bulk copy in DB2iSeries Provider.");
                }
                if (_bulkCopyCreator != null)
                {
                    var columns   = descriptor.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                    var rd        = new BulkCopyReader(dataConnection.DataProvider, dataConnection.MappingSchema, columns, source);
                    var rc        = new BulkCopyRowsCopied();
                    var bcOptions = 0;                     // Default
                    if (options.KeepIdentity == true)
                    {
                        bcOptions |= 1;                                                   // KeepIdentity = 1, TableLock = 2, Truncate = 4,
                    }
                    if (options.TableLock == true)
                    {
                        bcOptions |= 2;
                    }

                    using (var bc = _bulkCopyCreator(dataConnection.Connection, bcOptions))
                    {
                        dynamic dbc         = bc;
                        var     notifyAfter = options.NotifyAfter == 0 && options.MaxBatchSize.HasValue ?
                                              options.MaxBatchSize.Value : options.NotifyAfter;
                        if (notifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            if (_bulkCopySubscriber == null)
                            {
                                _bulkCopySubscriber = CreateBulkCopySubscriber(bc, "DB2iSeriesRowsCopied");
                            }
                            dbc.NotifyAfter = notifyAfter;
                            _bulkCopySubscriber(bc, arg =>
                            {
                                dynamic darg  = arg;
                                rc.RowsCopied = darg.RowsCopied;
                                options.RowsCopiedCallback(rc);
                                if (rc.Abort)
                                {
                                    darg.Abort = true;
                                }
                            });
                        }
                        if (options.BulkCopyTimeout.HasValue)
                        {
                            dbc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                        }
                        dbc.DestinationTableName = tableName;
                        for (var i = 0; i < columns.Count; i++)
                        {
                            dbc.ColumnMappings.Add((dynamic)_columnMappingCreator(i, columns[i].ColumnName));
                        }
                        dbc.WriteToServer(rd);
                    }
                    rc.RowsCopied = rd.Count;
                    return(rc);
                }
            }
            return(MultipleRowsCopy(dataConnection, options, source));
        }
Ejemplo n.º 15
0
        public void KeepIdentity_SkipOnInsertTrue(
            [DataSources(false)] string context,
            [Values(null, true, false)] bool?keepIdentity,
            [Values] BulkCopyType copyType)
        {
            // don't use transactions as some providers will fallback to non-provider-specific implementation then
            using (var db = new TestDataConnection(context))
                using (db.BeginTransaction())
                {
                    var lastId = db.InsertWithInt32Identity(new TestTable2());
                    try
                    {
                        var options = new BulkCopyOptions()
                        {
                            KeepIdentity = keepIdentity,
                            BulkCopyType = copyType
                        };

                        if (!Execute(context, perform, keepIdentity, copyType))
                        {
                            return;
                        }

                        var data = db.GetTable <TestTable2>().Where(_ => _.ID > lastId).OrderBy(_ => _.ID).ToArray();

                        Assert.AreEqual(2, data.Length);

                        // oracle supports identity insert only starting from version 12c, which is not used yet for tests
                        var useGenerated = keepIdentity != true ||
                                           context == ProviderName.Oracle ||
                                           context == ProviderName.OracleNative ||
                                           context == ProviderName.OracleManaged;

                        Assert.AreEqual(lastId + (!useGenerated ? 10 : 1), data[0].ID);
                        Assert.AreEqual(200, data[0].Value);
                        Assert.AreEqual(lastId + (!useGenerated ? 20 : 2), data[1].ID);
                        Assert.AreEqual(300, data[1].Value);

                        void perform()
                        {
                            db.BulkCopy(
                                options,
                                new[]
                            {
                                new TestTable2()
                                {
                                    ID    = lastId + 10,
                                    Value = 200
                                },
                                new TestTable2()
                                {
                                    ID    = lastId + 20,
                                    Value = 300
                                }
                            });
                        }
                    }
                    finally
                    {
                        // cleanup
                        db.GetTable <TestTable2>().Delete(_ => _.ID >= lastId);
                    }
                }
        }
Ejemplo n.º 16
0
 /// <summary>
 /// 大数据复制
 /// </summary>
 /// <param name="conn">连接源</param>
 /// <param name="tran">事务</param>
 /// <param name="dt">数据源 dt.TableName一定要和数据库表名对应</param>
 /// <param name="options">选项 默认Default</param>
 /// <param name="timeout">超时时间7200 2小时</param>
 /// <param name="batchSize">每一批次中的行数</param>
 /// <param name="error">错误处理</param>
 /// <returns></returns>
 public bool DataBulkCopy(IDbConnection conn, IDbTransaction tran, DataTable dt, BulkCopyOptions options = BulkCopyOptions.Default, int timeout = 7200, int batchSize = 10000, Action<Exception> error = null) {
     return false;
 }
Ejemplo n.º 17
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            [JetBrains.Annotations.NotNull] DataConnection dataConnection,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (dataConnection == null)
            {
                throw new ArgumentNullException("dataConnection");
            }

            var sqlBuilder = dataConnection.DataProvider.CreateSqlBuilder();
            var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
            var tableName  = GetTableName(sqlBuilder, descriptor);

            if (dataConnection.Transaction == null)
            {
                if (_bulkCopyCreator == null)
                {
                    var clientNamespace    = OracleTools.AssemblyName + ".Client.";
                    var bulkCopyType       = _connectionType.Assembly.GetType(clientNamespace + "OracleBulkCopy", false);
                    var bulkCopyOptionType = _connectionType.Assembly.GetType(clientNamespace + "OracleBulkCopyOptions", false);
                    var columnMappingType  = _connectionType.Assembly.GetType(clientNamespace + "OracleBulkCopyColumnMapping", false);

                    if (bulkCopyType != null)
                    {
                        _bulkCopyCreator      = CreateBulkCopyCreator(_connectionType, bulkCopyType, bulkCopyOptionType);
                        _columnMappingCreator = CreateColumnMappingCreator(columnMappingType);
                    }
                }

                if (_bulkCopyCreator != null)
                {
                    var columns = descriptor.Columns.Where(c => !c.SkipOnInsert).ToList();
                    var rd      = new BulkCopyReader(_dataProvider, columns, source);
                    var rc      = new BulkCopyRowsCopied();

                    var bcOptions = 0;                     // Default

                    if (options.UseInternalTransaction == true)
                    {
                        bcOptions |= 1;                                                             // UseInternalTransaction = 1,
                    }
                    using (var bc = _bulkCopyCreator(dataConnection.Connection, bcOptions))
                    {
                        dynamic dbc = bc;

                        var notifyAfter = options.NotifyAfter == 0 && options.MaxBatchSize.HasValue ?
                                          options.MaxBatchSize.Value : options.NotifyAfter;

                        if (notifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            if (_bulkCopySubscriber == null)
                            {
                                _bulkCopySubscriber = CreateBulkCopySubscriber(bc, "OracleRowsCopied");
                            }

                            dbc.NotifyAfter = notifyAfter;

                            _bulkCopySubscriber(bc, arg =>
                            {
                                dynamic darg  = arg;
                                rc.RowsCopied = darg.RowsCopied;
                                options.RowsCopiedCallback(rc);
                                if (rc.Abort)
                                {
                                    darg.Abort = true;
                                }
                            });
                        }

                        if (options.MaxBatchSize.HasValue)
                        {
                            dbc.BatchSize = options.MaxBatchSize.Value;
                        }
                        if (options.BulkCopyTimeout.HasValue)
                        {
                            dbc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                        }

                        dbc.DestinationTableName = tableName;

                        for (var i = 0; i < columns.Count; i++)
                        {
                            dbc.ColumnMappings.Add((dynamic)_columnMappingCreator(i, columns[i].ColumnName));
                        }

                        dbc.WriteToServer(rd);
                    }

                    rc.RowsCopied = rd.Count;

                    return(rc);
                }
            }

            return(MultipleRowsCopy(dataConnection, options, source));
        }
Ejemplo n.º 18
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            ITable <T> table,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (table.DataContext is DataConnection dataConnection && _provider.Adapter.BulkCopy != null)
            {
                var connection = _provider.TryGetProviderConnection(dataConnection.Connection, dataConnection.MappingSchema);

                // for run in transaction see
                // https://stackoverflow.com/questions/57675379
                // provider will call sp_oledb_columns which creates temp table
                var transaction = dataConnection.Transaction;
                if (connection != null && transaction != null)
                {
                    transaction = _provider.TryGetProviderTransaction(transaction, dataConnection.MappingSchema);
                }

                if (connection != null && (dataConnection.Transaction == null || transaction != null))
                {
                    var ed      = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                    var columns = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                    var sb      = _provider.CreateSqlBuilder(dataConnection.MappingSchema);
                    var rd      = new BulkCopyReader(dataConnection, columns, source);
                    var sqlopt  = SybaseProviderAdapter.AseBulkCopyOptions.Default;
                    var rc      = new BulkCopyRowsCopied();

                    if (options.CheckConstraints == true)
                    {
                        sqlopt |= SybaseProviderAdapter.AseBulkCopyOptions.CheckConstraints;
                    }
                    if (options.KeepIdentity == true)
                    {
                        sqlopt |= SybaseProviderAdapter.AseBulkCopyOptions.KeepIdentity;
                    }
                    if (options.TableLock == true)
                    {
                        sqlopt |= SybaseProviderAdapter.AseBulkCopyOptions.TableLock;
                    }
                    if (options.KeepNulls == true)
                    {
                        sqlopt |= SybaseProviderAdapter.AseBulkCopyOptions.KeepNulls;
                    }
                    if (options.FireTriggers == true)
                    {
                        sqlopt |= SybaseProviderAdapter.AseBulkCopyOptions.FireTriggers;
                    }
                    if (options.UseInternalTransaction == true)
                    {
                        sqlopt |= SybaseProviderAdapter.AseBulkCopyOptions.UseInternalTransaction;
                    }

                    using (var bc = _provider.Adapter.BulkCopy.Create(connection, sqlopt, transaction))
                    {
                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            bc.NotifyAfter = options.NotifyAfter;

                            bc.AseRowsCopied += (sender, args) =>
                            {
                                rc.RowsCopied = args.RowCopied;
                                options.RowsCopiedCallback(rc);
                                if (rc.Abort)
                                {
                                    args.Abort = true;
                                }
                            };
                        }

                        if (options.MaxBatchSize.HasValue)
                        {
                            bc.BatchSize = options.MaxBatchSize.Value;
                        }
                        if (options.BulkCopyTimeout.HasValue)
                        {
                            bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                        }

                        var tableName = GetTableName(sb, options, table);

                        // do not convert table and column names to valid sql name, as sybase bulk copy implementation
                        // doesn't understand escaped names (facepalm)
                        // which means it will probably fail when escaping required anyways...
                        bc.DestinationTableName = GetDestinationTableName(sb, options, table);

                        for (var i = 0; i < columns.Count; i++)
                        {
                            bc.ColumnMappings.Add(_provider.Adapter.BulkCopy.CreateColumnMapping(columns[i].ColumnName, columns[i].ColumnName));
                        }

                        TraceAction(
                            dataConnection,
                            () => "INSERT BULK " + tableName + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + Environment.NewLine,
                            () => { bc.WriteToServer(rd); return(rd.Count); });
                    }

                    if (rc.RowsCopied != rd.Count)
                    {
                        rc.RowsCopied = rd.Count;

                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                        {
                            options.RowsCopiedCallback(rc);
                        }
                    }

                    return(rc);
                }
            }

            return(MultipleRowsCopy(table, options, source));
        }
Ejemplo n.º 19
0
        private async Task <BulkCopyRowsCopied> ProviderSpecificCopyInternalAsync <T>(
            ProviderConnections providerConnections,
            ITable <T> table,
            BulkCopyOptions options,
            IAsyncEnumerable <T> source,
            CancellationToken cancellationToken)
            where T : notnull
        {
            var dataConnection = providerConnections.DataConnection;
            var connection     = providerConnections.ProviderConnection;
            var transaction    = providerConnections.ProviderTransaction;
            var ed             = table.DataContext.MappingSchema.GetEntityDescriptor(typeof(T));
            var columns        = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
            var sb             = _provider.CreateSqlBuilder(table.DataContext.MappingSchema);
            var rc             = new BulkCopyRowsCopied();

            var bc = _provider.Adapter.BulkCopy !.Create(connection, transaction);

            if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
            {
                bc.NotifyAfter = options.NotifyAfter;

                bc.MySqlRowsCopied += (sender, args) =>
                {
                    rc.RowsCopied += args.RowsCopied;
                    options.RowsCopiedCallback(rc);
                    if (rc.Abort)
                    {
                        args.Abort = true;
                    }
                };
            }

            if (options.BulkCopyTimeout.HasValue)
            {
                bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
            }

            var tableName = GetTableName(sb, options, table);

            bc.DestinationTableName = GetTableName(sb, options, table);

            for (var i = 0; i < columns.Count; i++)
            {
                bc.AddColumnMapping(_provider.Adapter.BulkCopy.CreateColumnMapping(i, columns[i].ColumnName));
            }

            // emulate missing BatchSize property
            // this is needed, because MySql fails on big batches, so users should be able to limit batch size
            var batches = EnumerableHelper.Batch(source, options.MaxBatchSize ?? int.MaxValue);

            await foreach (var batch in batches.WithCancellation(cancellationToken).ConfigureAwait(Configuration.ContinueOnCapturedContext))
            {
                var rd = new BulkCopyReader <T>(dataConnection, columns, batch, cancellationToken);

                await TraceActionAsync(
                    dataConnection,
                    () => (bc.HasWriteToServerAsync ? "INSERT ASYNC BULK " : "INSERT BULK ") + tableName + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + Environment.NewLine,
                    async() => {
                    if (bc.HasWriteToServerAsync)
                    {
                        await bc.WriteToServerAsync(rd, cancellationToken).ConfigureAwait(Configuration.ContinueOnCapturedContext);
                    }
                    else
                    {
                        bc.WriteToServer(rd);
                    }
                    return(rd.Count);
                }).ConfigureAwait(Configuration.ContinueOnCapturedContext);

                rc.RowsCopied += rd.Count;
            }

            if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
            {
                options.RowsCopiedCallback(rc);
            }

            return(rc);
        }
Ejemplo n.º 20
0
 protected virtual BulkCopyRowsCopied ProviderSpecificCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(MultipleRowsCopy(dataConnection, options, source));
 }
Ejemplo n.º 21
0
 protected override Task <BulkCopyRowsCopied> MultipleRowsCopyAsync <T>(ITable <T> table, BulkCopyOptions options, IAsyncEnumerable <T> source, CancellationToken cancellationToken)
 {
     return(MultipleRowsCopy1Async(table, options, source, cancellationToken));
 }
Ejemplo n.º 22
0
        protected BulkCopyRowsCopied MultipleRowsCopy3 <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source, string from)
        {
            var helper = new MultipleRowsHelper <T>(dataConnection, options, false);

            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(")")
            .AppendLine("SELECT * FROM")
            .Append("(");

            helper.SetHeader();

            foreach (var item in source)
            {
                helper.StringBuilder
                .AppendLine()
                .Append("\tSELECT ");
                helper.BuildColumns(item);
                helper.StringBuilder.Append(from);
                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()
                    .Append(")");
                    if (!helper.Execute())
                    {
                        return(helper.RowsCopied);
                    }
                }
            }

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

            return(helper.RowsCopied);
        }
Ejemplo n.º 23
0
 protected override Task <BulkCopyRowsCopied> ProviderSpecificCopyAsync <T>(
     ITable <T> table, BulkCopyOptions options, IEnumerable <T> source, CancellationToken cancellationToken)
 {
     // call the synchronous provider-specific implementation
     return(Task.FromResult(ProviderSpecificCopy(table, options, source)));
 }
Ejemplo n.º 24
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            [JetBrains.Annotations.NotNull] DataConnection dataConnection,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            if (dataConnection == null)
            {
                throw new ArgumentNullException("dataConnection");
            }

            var connection = dataConnection.Connection;

            if (connection == null)
            {
                return(MultipleRowsCopy(dataConnection, options, source));
            }

            if (!(connection.GetType() == _connectionType || connection.GetType().IsSubclassOfEx(_connectionType)))
            {
                return(MultipleRowsCopy(dataConnection, options, source));
            }

            var transaction = dataConnection.Transaction;
            var ed          = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
            var columns     = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
            var rc          = new BulkCopyRowsCopied();

            if (_bulkCopyCreator == null)
            {
                var clientNamespace    = _dataProvider.ConnectionNamespace;
                var bulkCopyType       = _connectionType.AssemblyEx().GetType(clientNamespace + ".HanaBulkCopy", false);
                var bulkCopyOptionType = _connectionType.AssemblyEx().GetType(clientNamespace + ".HanaBulkCopyOptions", false);
                var columnMappingType  = _connectionType.AssemblyEx().GetType(clientNamespace + ".HanaBulkCopyColumnMapping", false);
                var transactionType    = _connectionType.AssemblyEx().GetType(clientNamespace + ".HanaTransaction", false);

                if (bulkCopyType != null)
                {
                    _bulkCopyCreator      = SapHanaCreateBulkCopyCreator(_connectionType, bulkCopyType, bulkCopyOptionType, transactionType);
                    _columnMappingCreator = CreateColumnMappingCreator(columnMappingType);
                }
            }

            if (_bulkCopyCreator == null)
            {
                return(MultipleRowsCopy(dataConnection, options, source));
            }

            const int hanaOptions = 0;             //default;

            using (var bc = _bulkCopyCreator(connection, hanaOptions, transaction))
            {
                dynamic dbc = bc;

                if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                {
                    if (_bulkCopySubscriber == null)
                    {
                        _bulkCopySubscriber = CreateBulkCopySubscriber(bc, "HannaRowsCopied");
                    }

                    dbc.NotifyAfter = options.NotifyAfter;

                    _bulkCopySubscriber(bc, arg =>
                    {
                        dynamic darg  = arg;
                        rc.RowsCopied = darg.RowsCopied;
                        options.RowsCopiedCallback(rc);
                        if (rc.Abort)
                        {
                            darg.Abort = true;
                        }
                    });
                }

                if (options.MaxBatchSize.HasValue)
                {
                    dbc.BatchSize = options.MaxBatchSize.Value;
                }
                if (options.BulkCopyTimeout.HasValue)
                {
                    dbc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                }

                var sqlBuilder = _dataProvider.CreateSqlBuilder();
                var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                var tableName  = GetTableName(sqlBuilder, options, descriptor);

                dbc.DestinationTableName = tableName;

                for (var i = 0; i < columns.Count; i++)
                {
                    dbc.ColumnMappings.Add((dynamic)_columnMappingCreator(i, columns[i].ColumnName));
                }

                var rd = new BulkCopyReader(_dataProvider, columns, source);

                TraceAction(
                    dataConnection,
                    "INSERT BULK " + tableName + Environment.NewLine,
                    () => { dbc.WriteToServer(rd); return(rd.Count); });

                if (rc.RowsCopied != rd.Count)
                {
                    rc.RowsCopied = rd.Count;

                    if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                    {
                        options.RowsCopiedCallback(rc);
                    }
                }

                return(rc);
            }
        }
Ejemplo n.º 25
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(
            ITable <T> table,
            BulkCopyOptions options,
            IEnumerable <T> source)
        {
            // database name is not a part of table FQN in oracle
            var serverName = options.ServerName ?? table.ServerName;

            if (table.DataContext is DataConnection dataConnection && _provider.Adapter.BulkCopy != null &&
                serverName == null)
            {
                var connection = _provider.TryGetProviderConnection(dataConnection.Connection, dataConnection.MappingSchema);

                if (connection != null)
                {
                    var ed      = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                    var columns = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToList();
                    var sb      = _provider.CreateSqlBuilder(dataConnection.MappingSchema);

                    // ODP.NET doesn't bulk copy doesn't work if columns that require escaping:
                    // - if escaping applied, pre-flight validation fails as it performs uppercase comparison and quotes make it fail with
                    //   InvalidOperationException: Column mapping is invalid
                    // - if escaping not applied - if fails as expected on server, because it treats passed name as uppercased name
                    //   and gives "ORA-00904: "STRINGVALUE": invalid identifier" error
                    // That's quite common error in bulk copy implementation error by providers...
                    var supported = true;
                    foreach (var column in columns)
                    {
                        if (column.ColumnName != sb.ConvertInline(column.ColumnName, ConvertType.NameToQueryField))
                        {
                            // fallback to sql-based copy
                            // TODO: we should add support for by-ordinal column mapping to workaround it
                            supported = false;
                            break;
                        }
                    }

                    if (supported)
                    {
                        var rd     = new BulkCopyReader <T>(dataConnection, columns, source);
                        var sqlopt = OracleProviderAdapter.OracleBulkCopyOptions.Default;
                        var rc     = new BulkCopyRowsCopied();

                        var tableName  = sb.ConvertInline(options.TableName ?? table.TableName, ConvertType.NameToQueryTable);
                        var schemaName = options.SchemaName ?? table.SchemaName;
                        if (schemaName != null)
                        {
                            schemaName = sb.ConvertInline(schemaName, ConvertType.NameToSchema);
                        }

                        if (options.UseInternalTransaction == true)
                        {
                            sqlopt |= OracleProviderAdapter.OracleBulkCopyOptions.UseInternalTransaction;
                        }

                        using (var bc = _provider.Adapter.BulkCopy.Create(connection, sqlopt))
                        {
                            var notifyAfter = options.NotifyAfter == 0 && options.MaxBatchSize.HasValue
                                                        ? options.MaxBatchSize.Value
                                                        : options.NotifyAfter;

                            if (notifyAfter != 0 && options.RowsCopiedCallback != null)
                            {
                                bc.NotifyAfter = options.NotifyAfter;

                                bc.OracleRowsCopied += (sender, args) =>
                                {
                                    rc.RowsCopied = args.RowsCopied;
                                    options.RowsCopiedCallback(rc);
                                    if (rc.Abort)
                                    {
                                        args.Abort = true;
                                    }
                                };
                            }

                            if (options.MaxBatchSize.HasValue)
                            {
                                bc.BatchSize = options.MaxBatchSize.Value;
                            }

                            if (options.BulkCopyTimeout.HasValue)
                            {
                                bc.BulkCopyTimeout = options.BulkCopyTimeout.Value;
                            }
                            else if (Configuration.Data.BulkCopyUseConnectionCommandTimeout)
                            {
                                bc.BulkCopyTimeout = connection.ConnectionTimeout;
                            }

                            bc.DestinationTableName  = tableName;
                            bc.DestinationSchemaName = schemaName;

                            for (var i = 0; i < columns.Count; i++)
                            {
                                bc.ColumnMappings.Add(_provider.Adapter.BulkCopy.CreateColumnMapping(i, columns[i].ColumnName));
                            }

                            TraceAction(
                                dataConnection,
                                () => "INSERT BULK " + (schemaName == null ? tableName : schemaName + "." + tableName) + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + ")" + Environment.NewLine,
                                () => { bc.WriteToServer(rd); return(rd.Count); });
                        }

                        if (rc.RowsCopied != rd.Count)
                        {
                            rc.RowsCopied = rd.Count;

                            if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                            {
                                options.RowsCopiedCallback(rc);
                            }
                        }

                        return(rc);
                    }
                }
            }


            return(MultipleRowsCopy(table, options, source));
        }
Ejemplo n.º 26
0
 public virtual BulkCopyRowsCopied BulkCopy <T>(BulkCopyType bulkCopyType, ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(bulkCopyType switch
     {
         BulkCopyType.MultipleRows => MultipleRowsCopy(table, options, source),
         BulkCopyType.RowByRow => RowByRowCopy(table, options, source),
         _ => ProviderSpecificCopy(table, options, source),
     });
Ejemplo n.º 27
0
 public virtual BulkCopyRowsCopied BulkCopy <T>(ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
 {
     return(new BasicBulkCopy().BulkCopy(options.BulkCopyType, table, options, source));
 }
Ejemplo n.º 28
0
        protected override BulkCopyRowsCopied ProviderSpecificCopy <T>(ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
        {
            if (table.DataContext is DataConnection dataConnection)
            {
                var connection = _provider.TryGetProviderConnection(dataConnection.Connection, dataConnection.MappingSchema);

                if (connection == null)
                {
                    return(MultipleRowsCopy(table, options, source));
                }

                var sqlBuilder = (BasicSqlBuilder)_provider.CreateSqlBuilder(dataConnection.MappingSchema);
                var ed         = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
                var tableName  = GetTableName(sqlBuilder, options, table);
                var columns    = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToArray();

                var fields      = string.Join(", ", columns.Select(column => sqlBuilder.ConvertInline(column.ColumnName, ConvertType.NameToQueryField)));
                var copyCommand = $"COPY {tableName} ({fields}) FROM STDIN (FORMAT BINARY)";

                var rowsCopied = new BulkCopyRowsCopied();
                // batch size numbers not based on any strong grounds as I didn't found any recommendations for it
                var batchSize    = Math.Max(10, options.MaxBatchSize ?? 10000);
                var currentCount = 0;

                var key       = new { Type = typeof(T), options.KeepIdentity, ed };
                var rowWriter = (Action <MappingSchema, NpgsqlProviderAdapter.NpgsqlBinaryImporter, ColumnDescriptor[], T>)_rowWriterCache.GetOrAdd(
                    key,
                    _ => _provider.Adapter.CreateBinaryImportRowWriter <T>(_provider, sqlBuilder, columns, dataConnection.MappingSchema));

                var useComplete = _provider.Adapter.BinaryImporterHasComplete;
                var writer      = _provider.Adapter.BeginBinaryImport(connection, copyCommand);

                try
                {
                    foreach (var item in source)
                    {
                        rowWriter(dataConnection.MappingSchema, writer, columns, item);

                        currentCount++;
                        rowsCopied.RowsCopied++;

                        if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null && rowsCopied.RowsCopied % options.NotifyAfter == 0)
                        {
                            options.RowsCopiedCallback(rowsCopied);

                            if (rowsCopied.Abort)
                            {
                                if (!useComplete)
                                {
                                    writer.Cancel();
                                }
                                break;
                            }
                        }

                        if (currentCount >= batchSize)
                        {
                            if (useComplete)
                            {
                                writer.Complete();
                            }

                            writer.Dispose();

                            writer       = _provider.Adapter.BeginBinaryImport(connection, copyCommand);
                            currentCount = 0;
                        }
                    }

                    if (!rowsCopied.Abort)
                    {
                        TraceAction(
                            dataConnection,
                            () => "INSERT BULK " + tableName + "(" + string.Join(", ", columns.Select(x => x.ColumnName)) + Environment.NewLine,
                            () => {
                            if (useComplete)
                            {
                                writer.Complete();
                            }
                            return((int)rowsCopied.RowsCopied);
                        });
                    }

                    if (options.NotifyAfter != 0 && options.RowsCopiedCallback != null)
                    {
                        options.RowsCopiedCallback(rowsCopied);
                    }
                }
                catch when(!useComplete)
                {
                    writer.Cancel();
                    throw;
                }
                finally
                {
                    writer.Dispose();
                }

                return(rowsCopied);
            }

            return(MultipleRowsCopy(table, options, source));
        }
Ejemplo n.º 29
0
 public virtual Task <BulkCopyRowsCopied> BulkCopyAsync <T>(
     ITable <T> table, BulkCopyOptions options, IAsyncEnumerable <T> source, CancellationToken cancellationToken)
 {
     return(new BasicBulkCopy().BulkCopyAsync(options.BulkCopyType, table, options, source, cancellationToken));
 }
        protected override BulkCopyRowsCopied MultipleRowsCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            if ((options.MaxBatchSize ?? int.MaxValue) > MAX_ALLOWABLE_BATCH_SIZE)
            {
                options.MaxBatchSize = MAX_ALLOWABLE_BATCH_SIZE;
            }

            return(MultipleRowsCopy2(dataConnection, options, false, source, " FROM " + DB2iSeriesTools.iSeriesDummyTableName()));
        }
Ejemplo n.º 31
0
        public override BulkCopyRowsCopied BulkCopy <T>(DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            if (_bulkCopy == null)
            {
                _bulkCopy = new DB2BulkCopy(GetConnectionType());
            }

            return(_bulkCopy.BulkCopy(
                       options.BulkCopyType == BulkCopyType.Default ? DB2Tools.DefaultBulkCopyType : options.BulkCopyType,
                       dataConnection,
                       options,
                       source));
        }
Ejemplo n.º 32
0
 /// <summary>
 /// Oracle大数据复制
 /// </summary>
 /// <param name="dt">数据源 dt.TableName一定要和数据库表名对应</param>
 /// <param name="dbkey">数据库</param>
 /// <param name="options">选项 默认Default</param>
 /// <param name="isTran">是否使用事务 默认false</param>
 /// <param name="timeout">超时时间7200 2小时</param>
 /// <param name="batchSize">每一批次中的行数</param>
 /// <param name="error">错误处理</param>
 /// <returns>true/false</returns>
 public bool DataBulkCopy(DataTable dt, string dbkey = "", BulkCopyOptions options = BulkCopyOptions.Default, bool isTran = false, int timeout = 7200, int batchSize = 10000, Action<Exception> error = null) {
     if (Data.Pool(dbkey).DBType != "OleDb") return false;
     using (OleDbConnection connection = new OleDbConnection(Data.Pool(dbkey).ConnString)) {
         connection.Open();
         OleDbDataAdapter adapter = new OleDbDataAdapter("select * from " + dt.TableName + "  where 1=0", connection);
         OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
         int rowcount = dt.Rows.Count;
         for (int n = 0; n < rowcount; n++) {
             dt.Rows[n].SetAdded();
         }
         adapter.UpdateBatchSize = batchSize;
         try {
             adapter.Update(dt);
         } catch(Exception ex) {
             if (error.IsNotNull()) error(ex);
             return false;
         }
     }
     return true;
 }
Ejemplo n.º 33
0
        static void RunScript(string configString, string divider, string name, Action <IDbConnection> action = null, string database = null)
        {
            Console.WriteLine("=== " + name + " === \n");

            var scriptFolder = Path.Combine(Path.GetFullPath("."), "Database", "Create Scripts");

            Console.WriteLine("Script folder exists: {1}; {0}", scriptFolder, Directory.Exists(scriptFolder));

            var sqlFileName = Path.GetFullPath(Path.Combine(scriptFolder, Path.ChangeExtension(name, "sql")));

            Console.WriteLine("Sql file exists: {1}; {0}", sqlFileName, File.Exists(sqlFileName));

            var text = File.ReadAllText(sqlFileName);

            while (true)
            {
                var idx = text.IndexOf("SKIP " + configString + " BEGIN");

                if (idx >= 0)
                {
                    text = text.Substring(0, idx) + text.Substring(text.IndexOf("SKIP " + configString + " END", idx));
                }
                else
                {
                    break;
                }
            }

            var cmds = text
                       .Replace("{DBNAME}", database)
                       .Replace("\r", "")
                       .Replace(divider, "\x1")
                       .Split('\x1')
                       .Select(c => c.Trim())
                       .Where(c => !string.IsNullOrEmpty(c))
                       .ToArray();

            if (DataConnection.TraceSwitch.TraceInfo)
            {
                Console.WriteLine("Commands count: {0}", cmds.Length);
            }

            Exception exception = null;

            using (var db = new TestDataConnection(configString))
            {
                //db.CommandTimeout = 20;

                foreach (var command in cmds)
                {
                    try
                    {
                        if (DataConnection.TraceSwitch.TraceInfo)
                        {
                            Console.WriteLine(command);
                        }

                        if (configString == ProviderName.OracleNative)
                        {
                            // we need this to avoid errors in trigger creation when native provider
                            // recognize ":NEW" as parameter
                            var cmd = db.CreateCommand();
                            cmd.CommandText           = command;
                            ((dynamic)cmd).BindByName = false;
                            cmd.ExecuteNonQuery();
                        }
                        else
                        {
                            db.Execute(command);
                        }

                        if (DataConnection.TraceSwitch.TraceInfo)
                        {
                            Console.WriteLine("\nOK\n");
                        }
                    }
                    catch (Exception ex)
                    {
                        if (DataConnection.TraceSwitch.TraceError)
                        {
                            if (!DataConnection.TraceSwitch.TraceInfo)
                            {
                                Console.WriteLine(command);
                            }

                            var isDrop =
                                command.TrimStart().StartsWith("DROP") ||
                                command.TrimStart().StartsWith("CALL DROP");

#if APPVEYOR
                            if (!isDrop)
#endif
                            Console.WriteLine(ex.Message);

                            if (isDrop)
                            {
#if !APPVEYOR
                                Console.WriteLine("\nnot too OK\n");
#endif
                            }
                            else
                            {
                                Console.WriteLine("\nFAILED\n");

                                if (exception == null)
                                {
                                    exception = ex;
                                }
                            }
                        }
                    }
                }

                if (exception != null)
                {
                    throw exception;
                }

                if (DataConnection.TraceSwitch.TraceInfo)
                {
                    Console.WriteLine("\nBulkCopy LinqDataTypes\n");
                }

                var options = new BulkCopyOptions();

                db.BulkCopy(
                    options,
                    new []
                {
                    new LinqDataTypes2 {
                        ID = 1, MoneyValue = 1.11m, DateTimeValue = new DateTime(2001, 1, 11, 1, 11, 21, 100), BoolValue = true, GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue = 1, StringValue = null, BigIntValue = 1
                    },
                    new LinqDataTypes2 {
                        ID = 2, MoneyValue = 2.49m, DateTimeValue = new DateTime(2005, 5, 15, 5, 15, 25, 500), BoolValue = false, GuidValue = new Guid("bc663a61-7b40-4681-ac38-f9aaf55b706b"), SmallIntValue = 2, StringValue = "", BigIntValue = 2
                    },
                    new LinqDataTypes2 {
                        ID = 3, MoneyValue = 3.99m, DateTimeValue = new DateTime(2009, 9, 19, 9, 19, 29, 90), BoolValue = true, GuidValue = new Guid("d2f970c0-35ac-4987-9cd5-5badb1757436"), SmallIntValue = 3, StringValue = "1"
                    },
                    new LinqDataTypes2 {
                        ID = 4, MoneyValue = 4.50m, DateTimeValue = new DateTime(2009, 9, 20, 9, 19, 29, 90), BoolValue = false, GuidValue = new Guid("40932fdb-1543-4e4a-ac2c-ca371604fb4b"), SmallIntValue = 4, StringValue = "2"
                    },
                    new LinqDataTypes2 {
                        ID = 5, MoneyValue = 5.50m, DateTimeValue = new DateTime(2009, 9, 20, 9, 19, 29, 90), BoolValue = true, GuidValue = new Guid("febe3eca-cb5f-40b2-ad39-2979d312afca"), SmallIntValue = 5, StringValue = "3"
                    },
                    new LinqDataTypes2 {
                        ID = 6, MoneyValue = 6.55m, DateTimeValue = new DateTime(2009, 9, 22, 9, 19, 29, 90), BoolValue = false, GuidValue = new Guid("8d3c5d1d-47db-4730-9fe7-968f6228a4c0"), SmallIntValue = 6, StringValue = "4"
                    },
                    new LinqDataTypes2 {
                        ID = 7, MoneyValue = 7.00m, DateTimeValue = new DateTime(2009, 9, 23, 9, 19, 29, 90), BoolValue = true, GuidValue = new Guid("48094115-83af-46dd-a906-bff26ee21ee2"), SmallIntValue = 7, StringValue = "5"
                    },
                    new LinqDataTypes2 {
                        ID = 8, MoneyValue = 8.99m, DateTimeValue = new DateTime(2009, 9, 24, 9, 19, 29, 90), BoolValue = false, GuidValue = new Guid("c1139f1f-1335-4cd4-937e-92602f732dd3"), SmallIntValue = 8, StringValue = "6"
                    },
                    new LinqDataTypes2 {
                        ID = 9, MoneyValue = 9.63m, DateTimeValue = new DateTime(2009, 9, 25, 9, 19, 29, 90), BoolValue = true, GuidValue = new Guid("46c5c512-3d4b-4cf7-b4e7-1de080789e5d"), SmallIntValue = 9, StringValue = "7"
                    },
                    new LinqDataTypes2 {
                        ID = 10, MoneyValue = 10.77m, DateTimeValue = new DateTime(2009, 9, 26, 9, 19, 29, 90), BoolValue = false, GuidValue = new Guid("61b2bc55-147f-4b40-93ed-a4aa83602fee"), SmallIntValue = 10, StringValue = "8"
                    },
                    new LinqDataTypes2 {
                        ID = 11, MoneyValue = 11.45m, DateTimeValue = new DateTime(2009, 9, 27, 0, 0, 0, 0), BoolValue = true, GuidValue = new Guid("d3021d18-97f0-4dc0-98d0-f0c7df4a1230"), SmallIntValue = 11, StringValue = "9"
                    },
                    new LinqDataTypes2 {
                        ID = 12, MoneyValue = 11.45m, DateTimeValue = new DateTime(2012, 11, 7, 19, 19, 29, 90), BoolValue = true, GuidValue = new Guid("03021d18-97f0-4dc0-98d0-f0c7df4a1230"), SmallIntValue = 12, StringValue = "0"
                    }
                });

                if (DataConnection.TraceSwitch.TraceInfo)
                {
                    Console.WriteLine("\nBulkCopy Parent\n");
                }

                db.BulkCopy(
                    options,
                    new []
                {
                    new Parent {
                        ParentID = 1, Value1 = 1
                    },
                    new Parent {
                        ParentID = 2, Value1 = null
                    },
                    new Parent {
                        ParentID = 3, Value1 = 3
                    },
                    new Parent {
                        ParentID = 4, Value1 = null
                    },
                    new Parent {
                        ParentID = 5, Value1 = 5
                    },
                    new Parent {
                        ParentID = 6, Value1 = 6
                    },
                    new Parent {
                        ParentID = 7, Value1 = 1
                    }
                });

                if (DataConnection.TraceSwitch.TraceInfo)
                {
                    Console.WriteLine("\nBulkCopy Child\n");
                }

                db.BulkCopy(
                    options,
                    new []
                {
                    new Child {
                        ParentID = 1, ChildID = 11
                    },
                    new Child {
                        ParentID = 2, ChildID = 21
                    },
                    new Child {
                        ParentID = 2, ChildID = 22
                    },
                    new Child {
                        ParentID = 3, ChildID = 31
                    },
                    new Child {
                        ParentID = 3, ChildID = 32
                    },
                    new Child {
                        ParentID = 3, ChildID = 33
                    },
                    new Child {
                        ParentID = 4, ChildID = 41
                    },
                    new Child {
                        ParentID = 4, ChildID = 42
                    },
                    new Child {
                        ParentID = 4, ChildID = 43
                    },
                    new Child {
                        ParentID = 4, ChildID = 44
                    },
                    new Child {
                        ParentID = 6, ChildID = 61
                    },
                    new Child {
                        ParentID = 6, ChildID = 62
                    },
                    new Child {
                        ParentID = 6, ChildID = 63
                    },
                    new Child {
                        ParentID = 6, ChildID = 64
                    },
                    new Child {
                        ParentID = 6, ChildID = 65
                    },
                    new Child {
                        ParentID = 6, ChildID = 66
                    },
                    new Child {
                        ParentID = 7, ChildID = 77
                    }
                });

                if (DataConnection.TraceSwitch.TraceInfo)
                {
                    Console.WriteLine("\nBulkCopy GrandChild\n");
                }

                db.BulkCopy(
                    options,
                    new []
                {
                    new GrandChild {
                        ParentID = 1, ChildID = 11, GrandChildID = 111
                    },
                    new GrandChild {
                        ParentID = 2, ChildID = 21, GrandChildID = 211
                    },
                    new GrandChild {
                        ParentID = 2, ChildID = 21, GrandChildID = 212
                    },
                    new GrandChild {
                        ParentID = 2, ChildID = 22, GrandChildID = 221
                    },
                    new GrandChild {
                        ParentID = 2, ChildID = 22, GrandChildID = 222
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 31, GrandChildID = 311
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 31, GrandChildID = 312
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 31, GrandChildID = 313
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 32, GrandChildID = 321
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 32, GrandChildID = 322
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 32, GrandChildID = 323
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 33, GrandChildID = 331
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 33, GrandChildID = 332
                    },
                    new GrandChild {
                        ParentID = 3, ChildID = 33, GrandChildID = 333
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 41, GrandChildID = 411
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 41, GrandChildID = 412
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 41, GrandChildID = 413
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 41, GrandChildID = 414
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 42, GrandChildID = 421
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 42, GrandChildID = 422
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 42, GrandChildID = 423
                    },
                    new GrandChild {
                        ParentID = 4, ChildID = 42, GrandChildID = 424
                    }
                });


                db.BulkCopy(
                    options,
                    new[]
                {
                    new InheritanceParent2 {
                        InheritanceParentId = 1, TypeDiscriminator = null, Name = null
                    },
                    new InheritanceParent2 {
                        InheritanceParentId = 2, TypeDiscriminator = 1, Name = null
                    },
                    new InheritanceParent2 {
                        InheritanceParentId = 3, TypeDiscriminator = 2, Name = "InheritanceParent2"
                    }
                });

                db.BulkCopy(
                    options,
                    new[]
                {
                    new InheritanceChild2()
                    {
                        InheritanceChildId = 1, TypeDiscriminator = null, InheritanceParentId = 1, Name = null
                    },
                    new InheritanceChild2()
                    {
                        InheritanceChildId = 2, TypeDiscriminator = 1, InheritanceParentId = 2, Name = null
                    },
                    new InheritanceChild2()
                    {
                        InheritanceChildId = 3, TypeDiscriminator = 2, InheritanceParentId = 3, Name = "InheritanceParent2"
                    }
                });

                action?.Invoke(db.Connection);
            }
        }
Ejemplo n.º 34
0
 /// <summary>
 /// SqlServer大数据复制
 /// </summary>
 /// <param name="dr">数据源</param>
 /// <param name="tableName">对应的表名</param>
 /// <param name="dbkey">数据库</param>
 /// <param name="options">选项 默认Default</param>
 /// <param name="isTran">是否使用事务 默认false</param>
 /// <param name="timeout">超时时间7200 2小时</param>
 /// <param name="batchSize">每一批次中的行数</param>
 /// <param name="error">错误处理</param>
 /// <returns>true/false</returns>
 public bool DataBulkCopy(IDataReader dr, string tableName, string dbkey = "", BulkCopyOptions options = BulkCopyOptions.Default, bool isTran = false, int timeout = 7200, int batchSize = 10000, Action<Exception> error = null) {
     return false;
 }
Ejemplo n.º 35
0
        private BulkCopyRowsCopied ProviderSpecificCopyImpl <T>(DataConnection dataConnection, ITable <T> table, BulkCopyOptions options, IEnumerable <T> source)
            where T : notnull
        {
            var connection = _provider.TryGetProviderConnection(dataConnection.Connection, table.DataContext.MappingSchema);

            if (connection == null)
            {
                return(MultipleRowsCopy(table, options, source));
            }

            var sqlBuilder = (BasicSqlBuilder)_provider.CreateSqlBuilder(table.DataContext.MappingSchema);
            var ed         = table.DataContext.MappingSchema.GetEntityDescriptor(typeof(T));
            var tableName  = GetTableName(sqlBuilder, options, table);
            var columns    = ed.Columns.Where(c => !c.SkipOnInsert || options.KeepIdentity == true && c.IsIdentity).ToArray();

            var npgsqlTypes = new NpgsqlProviderAdapter.NpgsqlDbType[columns.Length];
            var columnTypes = new DbDataType[columns.Length];

            for (var i = 0; i < columns.Length; i++)
            {
                columnTypes[i] = columns[i].GetDbDataType(true);
                var npgsqlType = _provider.GetNativeType(columns[i].DbType, true);
                if (npgsqlType == null)
                {
                    var sb = new System.Text.StringBuilder();
                    sqlBuilder.BuildTypeName(sb, new SqlQuery.SqlDataType(columnTypes[i]));
                    npgsqlType = _provider.GetNativeType(sb.ToString(), true);
                }

                if (npgsqlType == null)
                {
                    throw new LinqToDBException($"Cannot guess PostgreSQL type for column {columns[i].ColumnName}. Specify type explicitly in column mapping.");
                }

                npgsqlTypes[i] = npgsqlType.Value;
            }

            var fields      = string.Join(", ", columns.Select(column => sqlBuilder.ConvertInline(column.ColumnName, ConvertType.NameToQueryField)));
            var copyCommand = $"COPY {tableName} ({fields}) FROM STDIN (FORMAT BINARY)";

            // batch size numbers not based on any strong grounds as I didn't found any recommendations for it
            var batchSize = Math.Max(10, options.MaxBatchSize ?? 10000);

            var writer = _provider.Adapter.BeginBinaryImport(connection, copyCommand);

            return(ProviderSpecificCopySyncImpl(dataConnection, options, source, connection, tableName, columns, columnTypes, npgsqlTypes, copyCommand, batchSize, writer));
        }