コード例 #1
0
        /// <summary>
        /// Bulk copies a set of objects to the server.
        /// </summary>
        /// <param name="connection">The connection to use.</param>
        /// <param name="tableName">The name of the table.</param>
        /// <param name="reader">The reader to read objects from.</param>
        /// <param name="configure">A callback method to configure the bulk copy object.</param>
        /// <param name="options">Options for initializing the bulk copy object.</param>
        /// <param name="transaction">An optional transaction to participate in.</param>
        public override void BulkCopy(IDbConnection connection, string tableName, IDataReader reader, Action <InsightBulkCopy> configure, InsightBulkCopyOptions options, IDbTransaction transaction)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }
            if (transaction != null)
            {
                throw new ArgumentException("OracleProvider does not support external transactions for bulk copy", "transaction");
            }

            OracleBulkCopyOptions oracleOptions = OracleBulkCopyOptions.Default;

            if (options.HasFlag(InsightBulkCopyOptions.UseInternalTransaction))
            {
                oracleOptions |= OracleBulkCopyOptions.UseInternalTransaction;
            }

            using (var bulk = new OracleBulkCopy((OracleConnection)connection, oracleOptions))
                using (var insightBulk = new OracleInsightBulkCopy(bulk))
                {
                    bulk.DestinationTableName = tableName;

                    // map the columns by name, in case we skipped a readonly column
                    foreach (DataRow row in reader.GetSchemaTable().Rows)
                    {
                        bulk.ColumnMappings.Add((string)row["ColumnName"], (string)row["ColumnName"]);
                    }

                    if (configure != null)
                    {
                        configure(insightBulk);
                    }
                    bulk.WriteToServer(reader);
                }
        }
コード例 #2
0
 public OracleBulkCopy(OracleConnection connection, OracleBulkCopyOptions options) => throw new NotImplementedException();
コード例 #3
0
    /// <summary>
    /// Oracle CopyBulk 批量插入功能<para></para>
    /// 使用 IgnoreColumns/InsertColumns 设置忽略/指定导入的列<para></para>
    /// 使用 WithConnection/WithTransaction 传入连接/事务对象<para></para>
    /// 提示:若本方法不能满足,请使用 IInsert&lt;T&gt;.ToDataTable 方法得到 DataTable 对象后,自行处理。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="that"></param>
    /// <param name="copyOptions"></param>
    /// <param name="batchSize"></param>
    /// <param name="bulkCopyTimeout"></param>
    public static void ExecuteOracleBulkCopy <T>(this IInsert <T> that, OracleBulkCopyOptions copyOptions = OracleBulkCopyOptions.Default, int?batchSize = null, int?bulkCopyTimeout = null) where T : class
    {
        var insert = that as FreeSql.Oracle.Curd.OracleInsert <T>;

        if (insert == null)
        {
            throw new Exception("ExecuteOracleBulkCopy 是 FreeSql.Provider.Oracle 特有的功能");
        }

        var dt = that.ToDataTable();

        if (dt.Rows.Count == 0)
        {
            return;
        }

        Action <OracleBulkCopy> writeToServer = bulkCopy =>
        {
            if (batchSize.HasValue)
            {
                bulkCopy.BatchSize = batchSize.Value;
            }
            if (bulkCopyTimeout.HasValue)
            {
                bulkCopy.BulkCopyTimeout = bulkCopyTimeout.Value;
            }
            bulkCopy.DestinationTableName = dt.TableName;
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                bulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
            }
            bulkCopy.WriteToServer(dt);
        };

        try
        {
            if (insert.InternalConnection == null && insert.InternalTransaction == null)
            {
                if (insert._orm.Ado?.TransactionCurrentThread != null)
                {
                    using (var bulkCopy = new OracleBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as OracleConnection, copyOptions))
                        writeToServer(bulkCopy);
                }
                else
                {
                    using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
                    {
                        using (var bulkCopy = copyOptions == OracleBulkCopyOptions.Default ?
                                              new OracleBulkCopy(conn.Value as OracleConnection) :
                                              new OracleBulkCopy(conn.Value as OracleConnection, copyOptions))
                        {
                            writeToServer(bulkCopy);
                        }
                    }
                }
            }
            else if (insert.InternalTransaction != null)
            {
                using (var bulkCopy = copyOptions == OracleBulkCopyOptions.Default ?
                                      new OracleBulkCopy(insert.InternalTransaction.Connection as OracleConnection) :
                                      new OracleBulkCopy(insert.InternalTransaction.Connection as OracleConnection, copyOptions))
                {
                    writeToServer(bulkCopy);
                }
            }
            else if (insert.InternalConnection != null)
            {
                var conn      = insert.InternalConnection as OracleConnection;
                var isNotOpen = false;
                if (conn.State != System.Data.ConnectionState.Open)
                {
                    isNotOpen = true;
                    conn.Open();
                }
                try
                {
                    using (var bulkCopy = copyOptions == OracleBulkCopyOptions.Default ?
                                          new OracleBulkCopy(conn) :
                                          new OracleBulkCopy(conn, copyOptions))
                    {
                        writeToServer(bulkCopy);
                    }
                }
                finally
                {
                    if (isNotOpen)
                    {
                        conn.Close();
                    }
                }
            }
            else
            {
                throw new NotImplementedException("ExecuteOracleBulkCopy 未实现错误,请反馈给作者");
            }
        }
        finally
        {
            dt.Clear();
        }
    }