SqlBulkCopy Classe

Definição

Permite-te carregar em massa de forma eficiente uma tabela SQL Server com dados de outra fonte.

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
Herança
SqlBulkCopy
Implementações

Exemplos

O aplicativo de console a seguir demonstra como carregar dados usando a SqlBulkCopy classe. Neste exemplo, a SqlDataReader é usado para copiar dados da tabela Production.Product na base de dados SQL Server AdventureWorks para uma tabela semelhante na mesma base de dados.

Importante

Este exemplo não será executado a menos que as tabelas de trabalho tenham sido criadas conforme descrito na configuração do exemplo de cópia em massa . Este código é fornecido apenas para demonstrar a sintaxe para usar SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, é mais fácil e rápido usar uma instrução Transact-SQL INSERT ... SELECT para copiar os dados.

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

Observações

Microsoft SQL Server inclui uma popular utilidade de prompt de comandos chamada bcp para mover dados de uma tabela para outra, seja num único servidor ou entre servidores. A SqlBulkCopy classe permite-lhe escrever soluções de código gerido que oferecem funcionalidades semelhantes. Existem outras formas de carregar dados numa tabela SQL Server (instruções INSERT, por exemplo), mas SqlBulkCopy oferecem uma vantagem significativa de desempenho em relação a elas.

A SqlBulkCopy classe pode ser usada para gravar dados somente em tabelas do SQL Server. No entanto, a fonte de dados não se limita a SQL Server; qualquer fonte de dados pode ser utilizada, desde que os dados possam ser carregados numa instância DataTable ou lidos com uma instância IDataReader.

SqlBulkCopy falhará ao carregar em massa uma coluna DataTable do tipo SqlDateTime numa coluna de SQL Server cujo tipo é um dos tipos de data/hora adicionados em SQL Server 2008.

Construtores

Name Description
SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

Inicializa uma nova instância da SqlBulkCopy classe usando a instância aberta existente fornecida de SqlConnection. A SqlBulkCopy instância comporta-se de acordo com as opções fornecidas no copyOptions parâmetro. Se for fornecido um não-nulo SqlTransaction , as operações de cópia serão realizadas dentro dessa transação.

SqlBulkCopy(SqlConnection)

Inicializa uma nova instância da SqlBulkCopy classe usando a instância aberta especificada de SqlConnection.

SqlBulkCopy(String, SqlBulkCopyOptions)

Inicializa e abre uma nova instância de SqlConnection com base no connectionString. O construtor usa isso SqlConnection para inicializar uma nova instância da SqlBulkCopy classe. A SqlConnection instância comporta-se de acordo com as opções fornecidas no copyOptions parâmetro.

SqlBulkCopy(String)

Inicializa e abre uma nova instância de SqlConnection com base no connectionString. O construtor usa o SqlConnection para inicializar uma nova instância da SqlBulkCopy classe.

Propriedades

Name Description
BatchSize

Número de linhas em cada lote. No final de cada lote, as linhas do lote são enviadas para o servidor.

BulkCopyTimeout

Número de segundos para a operação ser concluída antes de expirar.

ColumnMappings

Devolve uma coleção de SqlBulkCopyColumnMapping artigos. Os mapeamentos de colunas definem as relações entre as colunas da fonte de dados e as colunas do destino.

DestinationTableName

Nome da tabela de destino no servidor.

EnableStreaming

Permite ou desativa um SqlBulkCopy objeto para transmitir dados a partir de um IDataReader objeto.

NotifyAfter

Define o número de linhas a processar antes de gerar um evento de notificação.

Métodos

Name Description
Close()

Fecha a SqlBulkCopy instância.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
WriteToServer(DataRow[])

Copia todas as linhas do array fornecido DataRow para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServer(DataTable, DataRowState)

Copia apenas as linhas que correspondem ao estado da linha fornecida no fornecido DataTable para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServer(DataTable)

Copia todas as linhas do DataTable fornecido para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServer(DbDataReader)

Copia todas as linhas do array fornecido DbDataReader para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServer(IDataReader)

Copia todas as linhas do IDataReader fornecido para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServerAsync(DataRow[], CancellationToken)

A versão assíncrona de WriteToServer(DataRow[]), que copia todas as linhas do array fornecido DataRow para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

O token de cancelamento pode ser usado para pedir que a operação seja abandonada antes do tempo limite do comando. As exceções serão reportadas através do objeto Task devolvido.

WriteToServerAsync(DataRow[])

A versão assíncrona de WriteToServer(DataRow[]), que copia todas as linhas do array fornecido DataRow para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServerAsync(DataTable, CancellationToken)

A versão assíncrona de WriteToServer(DataTable), que copia todas as linhas do fornecido DataTable para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

O token de cancelamento pode ser usado para pedir que a operação seja abandonada antes do tempo limite do comando. As exceções serão reportadas através do objeto Task devolvido.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

A versão assíncrona de WriteToServer(DataTable, DataRowState), que copia apenas as linhas que correspondem ao estado da linha fornecida no fornecido DataTable para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

O token de cancelamento pode ser usado para pedir que a operação seja abandonada antes do tempo limite do comando. As exceções serão reportadas através do objeto Task devolvido.

WriteToServerAsync(DataTable, DataRowState)

A versão assíncrona de WriteToServer(DataTable, DataRowState), que copia apenas as linhas que correspondem ao estado da linha fornecida no fornecido DataTable para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServerAsync(DataTable)

A versão assíncrona de WriteToServer(DataTable), que copia todas as linhas do fornecido DataTable para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServerAsync(DbDataReader, CancellationToken)

A versão assíncrona de WriteToServer(DbDataReader), que copia todas as linhas do array fornecido DbDataReader para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServerAsync(DbDataReader)

A versão assíncrona de WriteToServer(DbDataReader), que copia todas as linhas do array fornecido DbDataReader para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

WriteToServerAsync(IDataReader, CancellationToken)

A versão assíncrona de WriteToServer(IDataReader), que copia todas as linhas do fornecido IDataReader para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

O token de cancelamento pode ser usado para pedir que a operação seja abandonada antes do tempo limite do comando. As exceções serão reportadas através do objeto Task devolvido.

WriteToServerAsync(IDataReader)

A versão assíncrona de WriteToServer(IDataReader), que copia todas as linhas do fornecido IDataReader para uma tabela de destino especificada pela DestinationTableName propriedade do SqlBulkCopy objeto.

evento

Name Description
SqlRowsCopied

Ocorre sempre que o número de linhas especificadas pela NotifyAfter propriedade foi processado.

Implementações de Interface Explícita

Name Description
IDisposable.Dispose()

Liberta todos os recursos usados pela instância atual da SqlBulkCopy classe.

Aplica-se a

Ver também