共用方式為


SqlBulkCopy 類別

定義

可讓您有效率地大量載入具有另一個來源的資料之 SQL Server 資料表。

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
繼承
SqlBulkCopy
實作

範例

下列主控台應用程式示範如何使用 SqlBulkCopy 類別載入資料。 在這個範例中,SqlDataReader 用於從 SQL Server AdventureWorks 資料庫的 Production.Product 資料表,將資料複製到同一資料庫中的類似資料表中。

重要

除非您已如大量複製範例設定中所述建立工作資料表,否則將不會執行此範例。 這個程式碼僅是為了示範使用 SqlBulkCopy 的語法而提供。 如果來源和目的地數據表位於相同的 SQL Server 實例中,使用 Transact-SQL INSERT … SELECT 語句來複製數據會比較簡單且更快速。

using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a sourceConnection to the AdventureWorks database.
        using (SqlConnection sourceConnection =
                   new SqlConnection(connectionString))
        {
            sourceConnection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                sourceConnection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

            // Get data from the source table as a SqlDataReader.
            SqlCommand commandSourceData = new SqlCommand(
                "SELECT ProductID, Name, " +
                "ProductNumber " +
                "FROM Production.Product;", sourceConnection);
            SqlDataReader reader =
                commandSourceData.ExecuteReader();

            // Open the destination connection. In the real world you would 
            // not use SqlBulkCopy to move data from one table to the other 
            // in the same database. This is for demonstration purposes only.
            using (SqlConnection destinationConnection =
                       new SqlConnection(connectionString))
            {
                destinationConnection.Open();

                // Set up the bulk copy object. 
                // Note that the column positions in the source
                // data reader match the column positions in 
                // the destination table so there is no need to
                // map columns.
                using (SqlBulkCopy bulkCopy =
                           new SqlBulkCopy(destinationConnection))
                {
                    bulkCopy.DestinationTableName =
                        "dbo.BulkCopyDemoMatchingColumns";

                    try
                    {
                        // Write from the source to the destination.
                        bulkCopy.WriteToServer(reader);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        // Close the SqlDataReader. The SqlBulkCopy
                        // object is automatically closed at the end
                        // of the using block.
                        reader.Close();
                    }
                }

                // Perform a final count on the destination 
                // table to see how many rows were added.
                long countEnd = System.Convert.ToInt32(
                    commandRowCount.ExecuteScalar());
                Console.WriteLine("Ending row count = {0}", countEnd);
                Console.WriteLine("{0} rows were added.", countEnd - countStart);
                Console.WriteLine("Press Enter to finish.");
                Console.ReadLine();
            }
        }
    }

    private static string GetConnectionString()
    // To avoid storing the sourceConnection string in your code, 
    // you can retrieve it from a configuration file. 
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

備註

Microsoft SQL Server 包含名為 bcp 的熱門命令提示字元公用程式,可將數據從一個數據表移至另一個數據表,無論是在單一伺服器或伺服器之間。 類別可讓您撰寫提供類似功能的 Managed 程式 SqlBulkCopy 代碼解決方案。 還有其他方法可將資料載入 SQL Server 資料表 (例如 INSERT 陳述式) 中,但 SqlBulkCopy 提供顯著超越其他方法的效能優勢。 SqlBulkCopy 類別只能用來將資料寫入到 SQL Server 資料表。 不過,數據源不限於 SQL Server;只要數據可以載入DataTable實例或使用 實例讀取IDataReader,就可以使用任何數據源。 SqlBulkCopy將類型的SqlDateTime數據行大量載入 DataTable SQL Server 數據行時失敗,其類型為 SQL Server 2008 中新增的日期/時間類型之一。

建構函式

SqlBulkCopy(SqlConnection)

使用 指定的開啟實例, SqlBulkCopy 初始化 類別的新實例 SqlConnection

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

使用 提供的現有開啟實例,初始化 類別的新 SqlBulkCopy 實例 SqlConnectionSqlBulkCopy實例會根據 中提供的選項來運作copyOptions 參數。 如果提供了非 null 的 SqlTransaction,則複製作業會在該交易執行。

SqlBulkCopy(String)

根據提供的 初始化並開啟 的新實例SqlConnectionconnectionString . 這個建構函式會使用 SqlConnection 來初始化 SqlBulkCopy 類別的新執行個體。

SqlBulkCopy(String, SqlBulkCopyOptions)

根據提供的 初始化並開啟 的新實例SqlConnectionconnectionString . 建構函式會使用 SqlConnection,初始化 SqlBulkCopy 類別的新執行個體。 SqlConnection實例會根據 中提供的選項來運作copyOptions 參數。

屬性

BatchSize

每個批次中的資料列數。 在每個批次的結尾,會將該批次中的資料列傳送到伺服器。

BulkCopyTimeout

完成作業逾時前的秒數。

ColumnMappings

傳回 SqlBulkCopyColumnMapping 項目的集合。 資料行對應會定義資料來源中資料行和目的地中資料行之間的關聯性。

ColumnOrderHints

傳回 SqlBulkCopyColumnOrderHint 項目的集合。 數據行順序提示描述目的地數據表叢集索引中的數據行排序順序。

DestinationTableName

該伺服器的目的地資料表名稱。

EnableStreaming

啟用或停用 SqlBulkCopy 物件,從 IDataReader 物件串流資料。

NotifyAfter

定義產生通知事件之前要處理的資料列數目。

RowsCopied

在進行中的大量複製作業中處理的數據列數目。

RowsCopied64

在進行中的大量複製作業中處理的數據列數目。

方法

Close()

關閉 SqlBulkCopy 執行個體。

WriteToServer(DataRow[])

將提供之 DataRow 陣列中的所有資料列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

WriteToServer(DataTable)

將所提供 DataTable 中的所有資料列複製到 SqlBulkCopy 物件 DestinationTableName 屬性所指定目的地資料表。

WriteToServer(DataTable, DataRowState)

只會將提供的 DataTable 中符合提供的資料列狀態之資料列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

WriteToServer(DbDataReader)

將提供之 DbDataReader 陣列中的所有資料列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

WriteToServer(IDataReader)

將所提供 IDataReader 中的所有資料列複製到 SqlBulkCopy 物件 DestinationTableName 屬性所指定目的地資料表。

WriteToServerAsync(DataRow[])

WriteToServer(DataRow[]) 的非同步版本,它會將所有資料列從提供的 DataRow 陣列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

WriteToServerAsync(DataRow[], CancellationToken)

WriteToServer(DataRow[]) 的非同步版本,它會將所有資料列從提供的 DataRow 陣列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

取消語彙基元可用於要求在命令逾時之前捨棄作業。 例外狀況將經由傳回的 Task 物件回報。

WriteToServerAsync(DataTable)

WriteToServer(DataTable) 的非同步版本,其會將提供的 DataTable 中的所有資料列複製到 DestinationTableName 物件的 SqlBulkCopy 屬性所指定的目的資料表。

WriteToServerAsync(DataTable, CancellationToken)

WriteToServer(DataTable) 的非同步版本,其會將提供的 DataTable 中的所有資料列複製到 DestinationTableName 物件的 SqlBulkCopy 屬性所指定的目的資料表。

取消語彙基元可用於要求在命令逾時之前捨棄作業。 例外狀況將經由傳回的 Task 物件回報。

WriteToServerAsync(DataTable, DataRowState)

WriteToServer(DataTable, DataRowState) 的非同步版本,它只會將提供的 DataTable 之內符合提供的資料列狀態之資料列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

WriteToServer(DataTable, DataRowState) 的非同步版本,它只會將提供的 DataTable 之內符合提供的資料列狀態之資料列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

取消語彙基元可用於要求在命令逾時之前捨棄作業。 例外狀況將經由傳回的 Task 物件回報。

WriteToServerAsync(DbDataReader)

WriteToServer(IDataReader) 的非同步版本,其會將提供的 IDataReader 中的所有資料列複製到 DestinationTableName 物件的 SqlBulkCopy 屬性所指定的目的資料表。

WriteToServerAsync(DbDataReader, CancellationToken)

WriteToServer(DbDataReader) 的非同步版本,它會將所有資料列從提供的 DbDataReader 陣列複製到 SqlBulkCopy 物件之 DestinationTableName 屬性所指定的目的資料表。

取消語彙基元可用於要求在命令逾時之前捨棄作業。 例外狀況將經由傳回的 Task 物件回報。

WriteToServerAsync(IDataReader)

WriteToServer(IDataReader) 的非同步版本,其會將提供的 IDataReader 中的所有資料列複製到 DestinationTableName 物件的 SqlBulkCopy 屬性所指定的目的資料表。

WriteToServerAsync(IDataReader, CancellationToken)

WriteToServer(IDataReader) 的非同步版本,其會將提供的 IDataReader 中的所有資料列複製到 DestinationTableName 物件的 SqlBulkCopy 屬性所指定的目的資料表。

取消語彙基元可用於要求在命令逾時之前捨棄作業。 例外狀況將經由傳回的 Task 物件回報。

事件

SqlRowsCopied

每次處理完 NotifyAfter 屬性指定的資料列數時就會發生。

明確介面實作

IDisposable.Dispose()

釋放 SqlBulkCopy 類別目前的執行個體所使用的全部資源。

適用於