SqlBulkCopy Klas

Definitie

Hiermee kunt u een SQL Server tabel efficiënt bulksgewijs laden met gegevens uit een andere bron.

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
Overname
SqlBulkCopy
Implementeringen

Voorbeelden

In de volgende consoletoepassing ziet u hoe u gegevens laadt met behulp van de SqlBulkCopy klasse. In dit voorbeeld wordt er een SqlDataReader gebruikt voor het kopiëren van gegevens uit de tabel Production.Product in de SQL Server AdventureWorks-database naar een vergelijkbare tabel in dezelfde database.

Important

Dit voorbeeld wordt niet uitgevoerd tenzij u de werktabellen hebt gemaakt, zoals beschreven in Bulk Copy Voorbeeldconfiguratie. Deze code wordt verstrekt om alleen de syntaxis voor het gebruik van SqlBulkCopy te demonstreren. Als de bron- en doeltabellen zich in hetzelfde SQL Server exemplaar bevinden, is het eenvoudiger en sneller om een Transact-SQL INSERT ... SELECT-instructie te gebruiken om de gegevens te kopiëren.

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

Opmerkingen

Microsoft SQL Server bevat een populair opdrachtpromptprogramma met de naam bcp voor het verplaatsen van gegevens van de ene tabel naar de andere, op één server of tussen servers. Met de SqlBulkCopy klasse kunt u beheerde codeoplossingen schrijven die vergelijkbare functionaliteit bieden. Er zijn andere manieren om gegevens te laden in een SQL Server-tabel (insert-instructies, bijvoorbeeld), maar SqlBulkCopy biedt een aanzienlijk prestatievoordeel ten opzichte van deze tabellen.

De SqlBulkCopy klasse kan worden gebruikt om alleen gegevens naar SQL Server-tabellen te schrijven. De gegevensbron is echter niet beperkt tot SQL Server; elke gegevensbron kan worden gebruikt, zolang de gegevens kunnen worden geladen in een DataTable-exemplaar of worden gelezen met een IDataReader-exemplaar.

SqlBulkCopy mislukt bij het bulksgewijs laden van een DataTable kolom van het type SqlDateTime in een SQL Server kolom waarvan het type een van de datum-/tijdtypen is die zijn toegevoegd in SQL Server 2008.

Constructors

Name Description
SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

Initialiseert een nieuw exemplaar van de SqlBulkCopy klasse met behulp van de opgegeven bestaande open instantie van SqlConnection. Het SqlBulkCopy exemplaar gedraagt zich volgens de opties die zijn opgegeven in de copyOptions parameter. Als er een niet-null-waarde SqlTransaction wordt opgegeven, worden de kopieerbewerkingen binnen die transactie uitgevoerd.

SqlBulkCopy(SqlConnection)

Initialiseert een nieuw exemplaar van de SqlBulkCopy klasse met behulp van de opgegeven open instantie van SqlConnection.

SqlBulkCopy(String, SqlBulkCopyOptions)

Initialiseert en opent een nieuw exemplaar van SqlConnection op basis van de opgegeven connectionString. De constructor gebruikt dit SqlConnection om een nieuw exemplaar van de SqlBulkCopy klasse te initialiseren. Het SqlConnection exemplaar gedraagt zich volgens de opties die zijn opgegeven in de copyOptions parameter.

SqlBulkCopy(String)

Initialiseert en opent een nieuw exemplaar van SqlConnection op basis van de opgegeven connectionString. De constructor gebruikt de SqlConnection opdracht om een nieuw exemplaar van de SqlBulkCopy klasse te initialiseren.

Eigenschappen

Name Description
BatchSize

Het aantal rijen in elke batch. Aan het einde van elke batch worden de rijen in de batch verzonden naar de server.

BulkCopyTimeout

Aantal seconden dat de bewerking moet worden voltooid voordat er een time-out optreedt.

ColumnMappings

Retourneert een verzameling SqlBulkCopyColumnMapping items. Kolomtoewijzingen definiëren de relaties tussen kolommen in de gegevensbron en kolommen in het doel.

DestinationTableName

Naam van de doeltabel op de server.

EnableStreaming

Hiermee schakelt u een SqlBulkCopy object in of uit om gegevens van een IDataReader object te streamen.

NotifyAfter

Definieert het aantal rijen dat moet worden verwerkt voordat een meldingsgebeurtenis wordt gegenereerd.

Methoden

Name Description
Close()

Hiermee sluit u de SqlBulkCopy instantie.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)
WriteToServer(DataRow[])

Kopieert alle rijen van de opgegeven DataRow matrix naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServer(DataTable, DataRowState)

Kopieert alleen rijen die overeenkomen met de opgegeven rijstatus in de opgegeven DataTable aan een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServer(DataTable)

Kopieert alle rijen in de opgegeven DataTable naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServer(DbDataReader)

Kopieert alle rijen van de opgegeven DbDataReader matrix naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServer(IDataReader)

Kopieert alle rijen in de opgegeven IDataReader naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServerAsync(DataRow[], CancellationToken)

De asynchrone versie van WriteToServer(DataRow[]), waarmee alle rijen van de opgegeven DataRow matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject.

WriteToServerAsync(DataRow[])

De asynchrone versie van WriteToServer(DataRow[]), waarmee alle rijen van de opgegeven DataRow matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServerAsync(DataTable, CancellationToken)

De asynchrone versie van WriteToServer(DataTable), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd DataTable die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

De asynchrone versie van WriteToServer(DataTable, DataRowState), waarmee alleen rijen worden gekopieerd die overeenkomen met de opgegeven rijstatus in de opgegeven DataTable doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject.

WriteToServerAsync(DataTable, DataRowState)

De asynchrone versie van WriteToServer(DataTable, DataRowState), waarmee alleen rijen worden gekopieerd die overeenkomen met de opgegeven rijstatus in de opgegeven DataTable doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServerAsync(DataTable)

De asynchrone versie van WriteToServer(DataTable), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd DataTable die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServerAsync(DbDataReader, CancellationToken)

De asynchrone versie van WriteToServer(DbDataReader), waarmee alle rijen van de opgegeven DbDataReader matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServerAsync(DbDataReader)

De asynchrone versie van WriteToServer(DbDataReader), waarmee alle rijen van de opgegeven DbDataReader matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

WriteToServerAsync(IDataReader, CancellationToken)

De asynchrone versie van WriteToServer(IDataReader), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd IDataReader die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject.

WriteToServerAsync(IDataReader)

De asynchrone versie van WriteToServer(IDataReader), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd IDataReader die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object.

gebeurtenis

Name Description
SqlRowsCopied

Vindt elke keer plaats dat het aantal rijen dat door de NotifyAfter eigenschap is opgegeven, is verwerkt.

Expliciete interface-implementaties

Name Description
IDisposable.Dispose()

Alle resources die door het huidige exemplaar van de SqlBulkCopy klasse worden gebruikt, worden vrijgegeven.

Van toepassing op

Zie ook