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

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. Para obtener más información, vea Always Encrypted.

Tenga cuidado al especificar AllowEncryptedValueModifications , ya que esto puede dar lugar a dañar la base de datos porque el controlador no comprueba si los datos están realmente cifrados, o si se cifran correctamente con el mismo tipo de cifrado, algoritmo y clave que la columna de destino.

CheckConstraints 2

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

Default 0

Usa los valores predeterminados para todas las opciones.

FireTriggers 16

Si se especifican, provoca que el servidor active los desencadenadores de inserción para las filas que se insertan en la base de datos.

KeepIdentity 1

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

KeepNulls 8

Conserva los valores nulos en la tabla de destino independientemente de la configuración para los valores predeterminados. Si no se especifica, los valores null se reemplazan por valores predeterminados si procede.

TableLock 4

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

UseInternalTransaction 32

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

Ejemplos

En la siguiente aplicación de consola se muestra cómo realizar una carga masiva que copia el valor en 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 cómo funciona 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 la consola que le notifica que las filas no se agregaron debido a infracciones de clave principal.

Importante

Este ejemplo no se ejecuta a menos que haya creado las tablas de trabajo como se describe en Configuración de ejemplos 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.

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

Comentarios

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

Se aplica a

Consulte también