SqlBulkCopyOptions Enumeração

Definição

Sinalizador bit a bit que especifica uma ou mais opções a serem usadas com uma instância de SqlBulkCopy.

Essa enumeração dá suporte a uma combinação bit a bit dos valores de membro.

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

Campos

Nome Valor Description
Default 0

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

KeepIdentity 1

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

CheckConstraints 2

Verificar restrições enquanto os dados são inseridos. Por padrão, as restrições não são verificadas.

TableLock 4

Obter um bloqueio de atualização em massa para a duração da operação de cópia em massa. Quando não especificado, os bloqueios de linha são usados.

KeepNulls 8

Preservar valores nulos na tabela de destino, independentemente das configurações dos 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, faça com que o servidor dispare os gatilhos de inserção para as linhas que estão sendo inseridas no banco de dados.

UseInternalTransaction 32

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

AllowEncryptedValueModifications 64

Quando especificado, AllowEncryptedValueModifications permite a cópia em massa de dados criptografados entre tabelas ou bancos de dados, sem descriptografar os dados. Normalmente, um aplicativo selecionaria dados de colunas criptografadas de uma tabela sem descriptografar os dados (o aplicativo se conectaria ao banco de dados com a palavra-chave de configuração de criptografia de coluna definida como desabilitada) e, em seguida, usaria essa opção para inserção em massa dos dados, que ainda estariam criptografado.

Tenha cuidado ao especificar AllowEncryptedValueModifications , pois isso pode levar à corromper o banco de dados porque o driver não verifica se os dados estão de fato criptografados ou se estão criptografados corretamente usando o mesmo tipo de criptografia, algoritmo e chave que a coluna de destino.

CacheMetadata 128

Quando especificado, o CacheMetadata armazena em cache os metadados da tabela de destino após a primeira operação de cópia em massa, permitindo que as operações subsequentes na mesma tabela ignorem a consulta de descoberta de metadados. Isso pode melhorar o desempenho ao executar várias operações de cópia em massa para a mesma tabela de destino.

Aviso: Use essa opção somente quando tiver certeza de que o esquema da tabela de destino não será alterado entre operações de cópia em massa. Se o esquema da tabela for alterado (colunas adicionadas, removidas ou modificadas), o uso de metadados armazenados em cache poderá resultar em corrupção de dados, operações com falha ou comportamento inesperado. Chame ClearCachedMetadata() para limpar o cache se o esquema for alterado.

O cache é invalidado automaticamente quando DestinationTableName é alterado para uma tabela diferente. A alteração ColumnMappings entre operações não requer invalidação de cache porque os metadados armazenados em cache descrevem apenas o esquema da tabela de destino, não o mapeamento de coluna de origem para destino.

O cache não é invalidado automaticamente quando o contexto de conexão é alterado. Se o banco de dados subjacente SqlConnection mudar (por exemplo, via ChangeDatabase(String)) ou se reconectar a um servidor diferente devido ao failover, os chamadores deverão ligar ClearCachedMetadata() para garantir que os metadados sejam atualizados.

Exemplos

O aplicativo de console a seguir demonstra como executar uma carga 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 altera a maneira como a carga em massa funciona, execute o exemplo com o dbo. Tabela BulkCopyDemoMatchingColumns vazia. Todas as linhas são carregadas da origem. Em seguida, execute o exemplo novamente sem esvaziar a tabela. Uma exceção é gerada e o código grava uma mensagem na janela do console notificando você de que as linhas não foram adicionadas devido a violações de chave primária.

Important

Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância do SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT para copiar os dados.

namespace SqlBulkCopy_KeepIdentity;

using System;
using System.Data;
// <Snippet1>
using Microsoft.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;";
    }
}
// </Snippet1>

Comentários

Você pode usar a SqlBulkCopyOptions enumeração ao construir uma SqlBulkCopy instância para alterar a forma como os WriteToServer(DbDataReader) métodos dessa instância se comportam.

Aplica-se a