SqlBulkCopyOptions Enumeración

Definición

Marca bit a bit que especifica una o varias opciones que se van a usar con una instancia de SqlBulkCopy.

Esta enumeración admite una combinación bit a bit de sus valores de miembro.

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

Campos

Nombre Valor Description
Default 0

Use los valores predeterminados para todas las opciones.

KeepIdentity 1

Mantiene los valores de identidad de origen. Cuando no se especifica, el destino asigna los valores de identidad.

CheckConstraints 2

Comprueba las restricciones mientras se insertan los datos. De forma predeterminada, no se comprueban las restricciones.

TableLock 4

Obtiene un bloqueo de actualización masiva durante toda la operación de copia masiva. Cuando no se especifica, se usan bloqueos de fila.

KeepNulls 8

Conserva los valores nulos en la tabla de destino independientemente de la configuración para los valores predeterminados. Cuando no se especifica, los valores NULL se reemplazan por valores predeterminados cuando corresponda.

FireTriggers 16

Cuando se especifica, haga que el servidor active los desencadenadores de inserción para las filas que se insertan en la base de datos.

UseInternalTransaction 32

Cuando se especifica, cada lote de la operación de copia masiva se producirá dentro de una transacción. Si indica esta opción y también proporciona un SqlTransaction objeto al constructor, se produce una ArgumentException excepción .

AllowEncryptedValueModifications 64

Cuando se especifica, AllowEncryptedValueModifications permite la copia masiva de datos cifrados entre tablas o bases de datos, sin descifrar los datos. Normalmente, una aplicación seleccionaría datos de las columnas cifradas de una tabla sin descifrar los datos (la aplicación se conectaría a la base de datos con la palabra clave de configuración de cifrado de columnas establecida en deshabilitada) y después usaría esta opción para insertar masivamente los datos, que siguen estando cifrados.

Tenga cuidado al especificar AllowEncryptedValueModifications , ya que esto puede provocar daños en la base de datos porque el controlador no comprueba si los datos están cifrados de hecho o si se cifran correctamente mediante el mismo tipo de cifrado, algoritmo y clave que la columna de destino.

CacheMetadata 128

Cuando se especifica, CacheMetadata almacena en caché los metadatos de la tabla de destino después de la primera operación de copia masiva, lo que permite que las operaciones posteriores en la misma tabla omitan la consulta de detección de metadatos. Esto puede mejorar el rendimiento al realizar varias operaciones de copia masiva en la misma tabla de destino.

Advertencia: Use esta opción solo cuando esté seguro de que el esquema de la tabla de destino no cambiará entre las operaciones de copia masiva. Si el esquema de la tabla cambia (columnas agregadas, eliminadas o modificadas), el uso de metadatos almacenados en caché puede provocar daños en los datos, operaciones con errores o un comportamiento inesperado. Llame ClearCachedMetadata() a para borrar la memoria caché si cambia el esquema.

La memoria caché se invalida automáticamente cuando DestinationTableName se cambia a una tabla diferente. El cambio ColumnMappings entre operaciones no requiere invalidación de caché porque los metadatos almacenados en caché solo describen el esquema de la tabla de destino, no la asignación de columnas de origen a destino.

La memoria caché no se invalida automáticamente cuando cambia el contexto de conexión. Si la base de datos de cambios subyacente SqlConnection (por ejemplo, a través ChangeDatabase(String)de ) o se vuelve a conectar a otro servidor debido a la conmutación por error, los autores de llamadas deben llamar ClearCachedMetadata() a para asegurarse de que se actualizan los metadatos.

Ejemplos

En la siguiente aplicación de consola se muestra cómo realizar una carga masiva que copia el valor de la columna de identidad de la tabla de origen en la columna correspondiente de la tabla de destino, en lugar de generar un nuevo valor para la columna de identidad de cada fila.

Para ver cómo cambia la opción de funcionamiento de la carga masiva, ejecute el ejemplo con dbo. Tabla BulkCopyDemoMatchingColumns vacía. Todas las filas se cargan desde el origen. A continuación, vuelva a ejecutar el ejemplo sin vaciar la tabla. Se produce una excepción y el código escribe un mensaje en la ventana de consola que le notifica que no se agregaron filas debido a infracciones de clave principal.

Importante

Este ejemplo no se ejecutará a menos que haya creado las tablas de trabajo como se describe en Configuración de ejemplo de copia masiva. Este código se proporciona para mostrar la sintaxis para usar SqlBulkCopy. Si las tablas de origen y destino están en la misma instancia de SQL Server, es más fácil y rápido usar una instrucción Transact-SQL INSERT … SELECT para copiar los datos.

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>

Comentarios

Puede usar la SqlBulkCopyOptions enumeración al construir una SqlBulkCopy instancia para cambiar el comportamiento de los WriteToServer(DbDataReader) métodos de esa instancia.

Se aplica a