SqlBulkCopy Klass

Definition

Gör att du effektivt kan massinläsa en SQL Server tabell med data från en annan källa.

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
Arv
SqlBulkCopy
Implementeringar

Exempel

Följande konsolprogram visar hur du läser in data med hjälp av SqlBulkCopy klassen. I det här exemplet används en SqlDataReader för att kopiera data från tabellen Production.Product i SQL Server AdventureWorks-databasen till en liknande tabell i samma databas.

Important

Det här exemplet körs inte om du inte har skapat arbetstabellerna enligt beskrivningen i Inställning för masskopieringsexempel. Den här koden tillhandahålls för att demonstrera syntaxen för att endast använda SqlBulkCopy . Om käll- och måltabellerna finns i samma SQL Server instans är det enklare och snabbare att använda en Transact-SQL INSERT ... SELECT-instruktion för att kopiera data.

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

Kommentarer

Microsoft SQL Server innehåller ett populärt kommandomeddelandeverktyg med namnet bcp för att flytta data från en tabell till en annan, oavsett om det är på en enskild server eller mellan servrar. Med SqlBulkCopy klassen kan du skriva hanterade kodlösningar som ger liknande funktioner. Det finns andra sätt att läsa in data i en SQL Server-tabell (TILL exempel INSERT-instruktioner), men SqlBulkCopy ger en betydande prestandafördel jämfört med dem.

Klassen SqlBulkCopy kan endast användas för att skriva data till SQL Server-tabeller. Datakällan är dock inte begränsad till SQL Server. Alla datakällor kan användas, så länge data kan läsas in till en DataTable-instans eller läsas med en IDataReader-instans.

SqlBulkCopy misslyckas när en DataTable kolumn av typen SqlDateTime i en SQL Server kolumn vars typ är en av de datum-/tidstyper som lades till i SQL Server 2008.

Konstruktorer

Name Description
SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

Initierar en ny instans av SqlBulkCopy klassen med den angivna befintliga öppna instansen av SqlConnection. Instansen SqlBulkCopy fungerar enligt de alternativ som anges i parametern copyOptions . Om en icke-null SqlTransaction anges utförs kopieringsåtgärderna inom transaktionen.

SqlBulkCopy(SqlConnection)

Initierar en ny instans av SqlBulkCopy klassen med den angivna öppna instansen av SqlConnection.

SqlBulkCopy(String, SqlBulkCopyOptions)

Initierar och öppnar en ny instans av SqlConnection baserat på den angivna connectionString. Konstruktorn använder den för att SqlConnection initiera en ny instans av SqlBulkCopy klassen. Instansen SqlConnection fungerar enligt de alternativ som anges i parametern copyOptions .

SqlBulkCopy(String)

Initierar och öppnar en ny instans av SqlConnection baserat på den angivna connectionString. Konstruktorn använder SqlConnection för att initiera en ny instans av SqlBulkCopy klassen.

Egenskaper

Name Description
BatchSize

Antal rader i varje batch. I slutet av varje batch skickas raderna i batchen till servern.

BulkCopyTimeout

Antal sekunder som åtgärden ska slutföras innan tidsgränsen uppnås.

ColumnMappings

Returnerar en samling SqlBulkCopyColumnMapping objekt. Kolumnmappningar definierar relationerna mellan kolumner i datakällan och kolumnerna i målet.

DestinationTableName

Namn på måltabellen på servern.

EnableStreaming

Aktiverar eller inaktiverar ett SqlBulkCopy objekt för att strömma data från ett IDataReader objekt.

NotifyAfter

Definierar antalet rader som ska bearbetas innan en meddelandehändelse genereras.

Metoder

Name Description
Close()

Stänger SqlBulkCopy-instansen.

Equals(Object)

Avgör om det angivna objektet är lika med det aktuella objektet.

(Ärvd från Object)
GetHashCode()

Fungerar som standard-hash-funktion.

(Ärvd från Object)
GetType()

Hämtar den aktuella instansen Type .

(Ärvd från Object)
MemberwiseClone()

Skapar en ytlig kopia av den aktuella Object.

(Ärvd från Object)
ToString()

Returnerar en sträng som representerar det aktuella objektet.

(Ärvd från Object)
WriteToServer(DataRow[])

Kopierar alla rader från den angivna DataRow matrisen till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServer(DataTable, DataRowState)

Kopierar endast rader som matchar det angivna radtillståndet i den angivna DataTable till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServer(DataTable)

Kopierar alla rader i den angivna DataTable till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServer(DbDataReader)

Kopierar alla rader från den angivna DbDataReader matrisen till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServer(IDataReader)

Kopierar alla rader i den angivna IDataReader till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServerAsync(DataRow[], CancellationToken)

Den asynkrona versionen av WriteToServer(DataRow[]), som kopierar alla rader från den angivna DataRow matrisen till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

Annulleringstoken kan användas för att begära att åtgärden avbryts innan tidsgränsen för kommandot förflutit. Undantag rapporteras via det returnerade aktivitetsobjektet.

WriteToServerAsync(DataRow[])

Den asynkrona versionen av WriteToServer(DataRow[]), som kopierar alla rader från den angivna DataRow matrisen till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServerAsync(DataTable, CancellationToken)

Den asynkrona versionen av WriteToServer(DataTable), som kopierar alla rader i den angivna DataTable till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

Annulleringstoken kan användas för att begära att åtgärden avbryts innan tidsgränsen för kommandot förflutit. Undantag rapporteras via det returnerade aktivitetsobjektet.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

Den asynkrona versionen av WriteToServer(DataTable, DataRowState), som endast kopierar rader som matchar det angivna radtillståndet i den angivna DataTable till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

Annulleringstoken kan användas för att begära att åtgärden avbryts innan tidsgränsen för kommandot förflutit. Undantag rapporteras via det returnerade aktivitetsobjektet.

WriteToServerAsync(DataTable, DataRowState)

Den asynkrona versionen av WriteToServer(DataTable, DataRowState), som endast kopierar rader som matchar det angivna radtillståndet i den angivna DataTable till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServerAsync(DataTable)

Den asynkrona versionen av WriteToServer(DataTable), som kopierar alla rader i den angivna DataTable till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServerAsync(DbDataReader, CancellationToken)

Den asynkrona versionen av WriteToServer(DbDataReader), som kopierar alla rader från den angivna DbDataReader matrisen till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServerAsync(DbDataReader)

Den asynkrona versionen av WriteToServer(DbDataReader), som kopierar alla rader från den angivna DbDataReader matrisen till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

WriteToServerAsync(IDataReader, CancellationToken)

Den asynkrona versionen av WriteToServer(IDataReader), som kopierar alla rader i den angivna IDataReader till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

Annulleringstoken kan användas för att begära att åtgärden avbryts innan tidsgränsen för kommandot förflutit. Undantag rapporteras via det returnerade aktivitetsobjektet.

WriteToServerAsync(IDataReader)

Den asynkrona versionen av WriteToServer(IDataReader), som kopierar alla rader i den angivna IDataReader till en måltabell som anges av DestinationTableName objektets SqlBulkCopy egenskap.

Händelser

Name Description
SqlRowsCopied

Inträffar varje gång som antalet rader som anges av NotifyAfter egenskapen har bearbetats.

Explicita gränssnittsimplementeringar

Name Description
IDisposable.Dispose()

Släpper alla resurser som används av den aktuella instansen SqlBulkCopy av klassen.

Gäller för

Se även