Teilen über


SqlBulkCopy Klasse

Definition

Ermöglicht den effizienten Massenladevorgang einer SQL Server-Tabelle mit Daten aus einer anderen Quelle.

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
Vererbung
SqlBulkCopy
Implementiert

Beispiele

Die folgende Konsolenanwendung zeigt das Laden von Daten mithilfe der Klasse SqlBulkCopy. In diesem Beispiel werden in der SQL Server-Datenbank AdventureWorks unter Verwendung von SqlDataReader Daten aus der Tabelle Production.Product in eine ähnliche Tabelle derselben Datenbank kopiert.

Wichtig

Dieses Beispiel wird nur ausgeführt, wenn Sie die Arbeitstabellen zuvor wie unter Massenkopierbeispiel-Einrichtung beschrieben erstellt haben. Der angegebene Code dient nur zur Demonstration der Syntax für die Verwendung von SqlBulkCopy. Wenn sich quell- und zieltabellen im gleichen SQL Server instance befinden, ist es einfacher und schneller, eine Transact-SQL-Anweisung INSERT ... SELECT zum Kopieren der Daten zu verwenden.

using System.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;";
    }
}
Imports System.Data.SqlClient

Module Module1
    Sub Main()
        Dim connectionString As String = GetConnectionString()

        ' Open a connection to the AdventureWorks database.
        Using sourceConnection As SqlConnection = _
           New SqlConnection(connectionString)
            sourceConnection.Open()

            ' Perform an initial count on the destination table.
            Dim commandRowCount As New SqlCommand( _
            "SELECT COUNT(*) FROM dbo.BulkCopyDemoMatchingColumns;", _
                sourceConnection)
            Dim countStart As Long = _
               System.Convert.ToInt32(commandRowCount.ExecuteScalar())
            Console.WriteLine("Starting row count = {0}", countStart)

            ' Get data from the source table as a SqlDataReader.
            Dim commandSourceData As New SqlCommand( _
               "SELECT ProductID, Name, ProductNumber " & _
               "FROM Production.Product;", sourceConnection)
            Dim reader As SqlDataReader = 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 destinationConnection As SqlConnection = _
                New SqlConnection(connectionString)
                destinationConnection.Open()

                ' Set up the bulk copy object. 
                ' 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 bulkCopy As SqlBulkCopy = _
                  New SqlBulkCopy(destinationConnection)
                    bulkCopy.DestinationTableName = _
                    "dbo.BulkCopyDemoMatchingColumns"

                    Try
                        ' Write from the source to the destination.
                        bulkCopy.WriteToServer(reader)

                    Catch ex As Exception
                        Console.WriteLine(ex.Message)

                    Finally
                        ' Close the SqlDataReader. The SqlBulkCopy
                        ' object is automatically closed at the end
                        ' of the Using block.
                        reader.Close()
                    End Try
                End Using

                ' Perform a final count on the destination table
                ' to see how many rows were added.
                Dim countEnd As Long = _
                    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()
            End Using
        End Using
    End Sub

    Private Function GetConnectionString() As String
        ' 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;"
    End Function
End Module

Hinweise

Microsoft SQL Server enthält ein beliebtes Eingabeaufforderungshilfsprogramm namens bcp zum Verschieben von Daten aus einer Tabelle in eine andere, egal ob auf einem einzelnen Server oder zwischen Servern. Mit SqlBulkCopy der -Klasse können Sie lösungen für verwalteten Code schreiben, die ähnliche Funktionen bereitstellen. Es gibt eine Reihe weiterer Verfahren, Daten in eine SQL Server-Tabelle zu laden (beispielsweise INSERT-Anweisungen), aber SqlBulkCopy bietet im Vergleich einen erheblichen Leistungsvorteil.

Die SqlBulkCopy-Klasse kann nur zum Schreiben von Daten in SQL Server-Tabellen verwendet werden. Die Datenquelle ist jedoch nicht auf SQL Server beschränkt. Jede Datenquelle kann verwendet werden, solange die Daten in ein DataTable instance geladen oder mit einem IDataReader instance gelesen werden können.

SqlBulkCopyschlägt fehl, wenn eine DataTable Spalte vom Typ SqlDateTime massenweise in eine SQL Server Spalte geladen wird, deren Typ einer der in SQL Server 2008 hinzugefügten Datums-/Uhrzeittypen ist.

Konstruktoren

SqlBulkCopy(SqlConnection)

Hiermit wird eine neue Instanz der SqlBulkCopy-Klasse mithilfe der angegebenen geöffneten Instanz von SqlConnection initialisiert.

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

Initialisiert mit der angegebenen geöffneten Instanz von SqlBulkCopy eine neue Instanz der SqlConnection-Klasse. Die SqlBulkCopy-Instanz verhält sich entsprechend den Optionen, die im copyOptions-Parameter angegeben wurden. Wenn eine SqlTransaction ungleich Null angegeben wird, erfolgen die Kopiervorgänge innerhalb dieser Transaktion.

SqlBulkCopy(String)

Hiermit wird eine neue Instanz von SqlConnection auf Grundlage der angegebenen connectionString initialisiert und geöffnet. Im Konstruktor wird die SqlConnection verwendet, um eine neue Instanz der SqlBulkCopy-Klasse zu initialisieren.

SqlBulkCopy(String, SqlBulkCopyOptions)

Initialisiert und öffnet auf Grundlage des angegebenen connectionString eine neue Instanz von SqlConnection. Der Konstruktor initialisiert mithilfe von SqlConnection eine neue Instanz der SqlBulkCopy-Klasse. Die SqlConnection-Instanz verhält sich entsprechend den Optionen, die im copyOptions-Parameter angegeben wurden.

Eigenschaften

BatchSize

Anzahl der Zeilen in jedem Batch. Am Ende jedes Batches werden die im Batch enthaltenen Zeilen an den Server gesendet.

BulkCopyTimeout

Anzahl der Sekunden zum Abschließen des Vorgangs, bevor ein Timeout auftritt.

ColumnMappings

Gibt eine Auflistung von SqlBulkCopyColumnMapping-Elementen zurück. Spaltenzuordnungen definieren die Beziehungen zwischen Spalten in der Datenquelle und den Spalten im Ziel.

DestinationTableName

Name der Zieltabelle auf dem Server.

EnableStreaming

Aktiviert oder deaktiviert ein SqlBulkCopy-Objekt für das Streamen von Daten aus einem IDataReader-Objekt.

NotifyAfter

Definiert die Anzahl der Zeilen, die verarbeitet werden, bevor ein Benachrichtigungsereignis generiert wird.

Methoden

Close()

Hiermit wird die SqlBulkCopy-Instanz geschlossen.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
WriteToServer(DataRow[])

Kopiert alle Zeilen aus dem angegebenen DataRow-Array in eine Zieltabelle, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServer(DataTable)

Hiermit werden alle Zeilen in der angegebenen DataTable in eine Zieltabelle kopiert, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts festgelegt wird.

WriteToServer(DataTable, DataRowState)

Kopiert nur die Zeilen, die dem angegebenen Zeilenstatus in der bereitgestellten DataTable entsprechen, in eine Zieltabelle, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServer(DbDataReader)

Kopiert alle Zeilen aus dem angegebenen DbDataReader-Array in eine Zieltabelle, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServer(IDataReader)

Hiermit werden alle Zeilen in der angegebenen IDataReader in eine Zieltabelle kopiert, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts festgelegt wird.

WriteToServerAsync(DataRow[])

Die asynchrone Version von WriteToServer(DataRow[]), mit der alle Zeilen aus dem bereitgestellten DataRow-Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServerAsync(DataRow[], CancellationToken)

Die asynchrone Version von WriteToServer(DataRow[]), mit der alle Zeilen aus dem bereitgestellten DataRow-Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Timeout des Befehls abläuft. Ausnahmen werden über das zurückgegebene Aufgabenobjekt gemeldet.

WriteToServerAsync(DataTable)

Eine asynchrone Version von WriteToServer(DataTable), die alle Zeilen in das bereitgestellte DataTable-Array in eine Zieltabelle kopiert, die von der DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben wird.

WriteToServerAsync(DataTable, CancellationToken)

Eine asynchrone Version von WriteToServer(DataTable), die alle Zeilen in das bereitgestellte DataTable-Array in eine Zieltabelle kopiert, die von der DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben wird.

Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Timeout des Befehls abläuft. Ausnahmen werden über das zurückgegebene Aufgabenobjekt gemeldet.

WriteToServerAsync(DataTable, DataRowState)

Die asynchrone Version von WriteToServer(DataTable, DataRowState), die nur die Zeilen, die dem angegebenen Zeilenstatus in der bereitgestellten DataTable entsprechen, in eine Zieltabelle kopiert, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

Die asynchrone Version von WriteToServer(DataTable, DataRowState), die nur die Zeilen, die dem angegebenen Zeilenstatus in der bereitgestellten DataTable entsprechen, in eine Zieltabelle kopiert, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Timeout des Befehls abläuft. Ausnahmen werden über das zurückgegebene Aufgabenobjekt gemeldet.

WriteToServerAsync(DbDataReader)

Die asynchrone Version von WriteToServer(DbDataReader), mit der alle Zeilen aus dem bereitgestellten DbDataReader-Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServerAsync(DbDataReader, CancellationToken)

Die asynchrone Version von WriteToServer(DbDataReader), mit der alle Zeilen aus dem bereitgestellten DbDataReader-Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben ist.

WriteToServerAsync(IDataReader)

Eine asynchrone Version von WriteToServer(IDataReader), die alle Zeilen in das bereitgestellte IDataReader-Array in eine Zieltabelle kopiert, die von der DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben wird.

WriteToServerAsync(IDataReader, CancellationToken)

Eine asynchrone Version von WriteToServer(IDataReader), die alle Zeilen in das bereitgestellte IDataReader-Array in eine Zieltabelle kopiert, die von der DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts angegeben wird.

Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Timeout des Befehls abläuft. Ausnahmen werden über das zurückgegebene Aufgabenobjekt gemeldet.

Ereignisse

SqlRowsCopied

Tritt jedes Mal auf, wenn die durch die NotifyAfter-Eigenschaft angegebene Anzahl von Zeilen verarbeitet wurde.

Explizite Schnittstellenimplementierungen

IDisposable.Dispose()

Gibt alle von der aktuellen Instanz der SqlBulkCopy-Klasse verwendeten Ressourcen frei.

Gilt für:

Weitere Informationen