SqlBulkCopyOptions Enumeração

Definição

flag bit a bit que especifica uma ou mais opções para usar com uma instância de SqlBulkCopy.

Esta enumeração suporta uma combinação bit-a-bit dos respetivos valores membro.

public enum class SqlBulkCopyOptions
[System.Flags]
public enum SqlBulkCopyOptions
[<System.Flags>]
type SqlBulkCopyOptions = 
Public Enum SqlBulkCopyOptions
Herança
SqlBulkCopyOptions
Atributos

Campos

Name Valor Description
Default 0

Use os valores padrão para todas as opções.

KeepIdentity 1

Preservar os valores de identidade de origem. Quando não especificados, os valores de identidade são atribuídos pelo destino.

CheckConstraints 2

Verifique as restrições enquanto os dados estão a ser inseridos. Por defeito, as restrições não são verificadas.

TableLock 4

Obtenha um bloqueio de atualização em massa durante a operação de cópia em massa. Quando não especificado, são usados bloqueios de fila.

KeepNulls 8

Preserve os valores nulos na tabela de destino independentemente das definições para valores padrão. Quando não especificados, os valores nulos são substituídos por valores padrão quando aplicável.

FireTriggers 16

Quando especificado, faz com que o servidor dispare os gatilhos de inserção para as linhas inseridas na base de dados.

UseInternalTransaction 32

Quando especificado, cada lote da operação de cópia em massa ocorre dentro de uma transação. Se indicar esta opção e também fornecer um SqlTransaction objeto ao construtor, ocorre un.ArgumentException

AllowEncryptedValueModifications 64

Quando especificado, AllowEncryptedValueModifications permite a cópia em massa de dados encriptados entre tabelas ou bases de dados, sem necessidade de descifrar os dados. Normalmente, uma aplicação selecionava dados de colunas encriptadas de uma tabela sem descifrar os dados (a aplicação ligava-se à base de dados com a palavra-chave de encriptação de coluna definida para desativada) e depois usava esta opção para inserir em massa os dados, que ainda estavam encriptados. Para obter mais informações, consulte Sempre criptografado.

Tenha cautela ao especificar AllowEncryptedValueModifications , pois isso pode levar a corromper a base de dados porque o driver não verifica se os dados estão realmente encriptados, ou se estão corretamente encriptados usando o mesmo tipo de encriptação, algoritmo e chave da coluna de destino.

Exemplos

A aplicação de consola seguinte demonstra como realizar um carregamento em massa que copia o valor na coluna de identidade da tabela de origem para a coluna correspondente na tabela de destino, em vez de gerar um novo valor para a coluna de identidade de cada linha.

Para ver como a opção muda a forma como a carga em massa funciona, executa a amostra com o dbo. Tabela BulkCopyDemoMatchingColumns vazia. Todas as linhas carregam a partir da fonte. De seguida, execute a amostra novamente sem esvaziar a tabela. É lançada uma exceção, e o código escreve uma mensagem na janela da consola a notificar que as linhas não foram adicionadas devido a violações de teclas primárias.

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();

            // Create the SqlBulkCopy object using a connection string
            // and the KeepIdentity option.
            // In the real world you would not use SqlBulkCopy to move
            // data from one table to the other in the same database.
            using (SqlBulkCopy bulkCopy =
                new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
            {
                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 SqlCommand = New SqlCommand( _
               "SELECT ProductID, Name, ProductNumber " & _
               "FROM Production.Product;", sourceConnection)
            Dim reader As SqlDataReader = commandSourceData.ExecuteReader

            ' Create the SqlBulkCopy object using a connection string 
            ' and the KeepIdentity option. 
            ' In the real world you would not use SqlBulkCopy to move
            ' data from one table to the other in the same database.
            Using bulkCopy As SqlBulkCopy = _
              New SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)
                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 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

Pode usar a SqlBulkCopyOptions enumeração quando constrói uma SqlBulkCopy instância para alterar o comportamento dos WriteToServer métodos dessa instância.

Aplica-se a

Ver também