SqlBulkCopy Clase

Definición

Permite realizar eficazmente la carga masiva de una tabla de SQL Server con datos procedentes de otro origen.

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
Herencia
SqlBulkCopy
Implementaciones

Ejemplos

La aplicación de consola siguiente muestra cómo cargar datos mediante la clase SqlBulkCopy. En este ejemplo se usa SqlDataReader para copiar datos de la tabla Production.Product de la base de datos AdventureWorks de SQL Server en una tabla similar de la misma base de datos.

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

            // 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

Comentarios

Microsoft SQL Server incluye una popular utilidad de símbolo del sistema denominada bcp para mover datos de una tabla a otra, ya sea en un solo servidor o entre servidores. La SqlBulkCopy clase permite escribir soluciones de código administrado que proporcionan una funcionalidad similar. Hay otras maneras de cargar datos en una tabla de SQL Server (las instrucciones INSERT, por ejemplo), pero SqlBulkCopy ofrece una importante ventaja de rendimiento sobre ellas.

La clase SqlBulkCopy puede usarse para escribir datos solo en tablas de SQL Server. Sin embargo, el origen de datos no se limita a SQL Server; se puede usar cualquier origen de datos, siempre que los datos se puedan cargar en una DataTable instancia o leerse con una IDataReader instancia.

SqlBulkCopyse producirá un error al cargar de forma masiva una DataTable columna de tipo SqlDateTime en una columna de SQL Server cuyo tipo sea uno de los tipos de fecha y hora agregados en SQL Server 2008.

Constructores

SqlBulkCopy(SqlConnection)

Inicializa una instancia nueva de la clase SqlBulkCopy mediante la instancia abierta especificada de SqlConnection.

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

Inicializa una nueva instancia de la clase SqlBulkCopy utilizando la instancia abierta proporcionada de SqlConnection. La instancia de SqlBulkCopy se comporta según las opciones proporcionadas en el parámetro copyOptions. Si se suministra un valor no nulo SqlTransaction, las operaciones de copia se realizarán dentro de esa transacción.

SqlBulkCopy(String)

Inicializa y abre una instancia nueva de SqlConnection en función del valor connectionString proporcionado. El constructor usa SqlConnection para inicializar una instancia nueva de la clase SqlBulkCopy.

SqlBulkCopy(String, SqlBulkCopyOptions)

Inicializa y abre una nueva instancia de SqlConnection basándose en el parámetro connectionString proporcionado. El constructor utiliza esa conexión SqlConnection para inicializar una nueva instancia de la clase SqlBulkCopy. La instancia de SqlConnection se comporta según las opciones proporcionadas en el parámetro copyOptions.

Propiedades

BatchSize

Número de filas en cada lote. Al final de cada lote, las filas del lote se envían al servidor.

BulkCopyTimeout

Número de segundos para que la operación se complete antes de que se agote el tiempo de espera.

ColumnMappings

SqlBulkCopyColumnMapping devuelve una colección de elementos. Las asignaciones de columnas definen las relaciones entre las columnas del origen de datos y las columnas del destino.

DestinationTableName

Nombre de la tabla de destino en el servidor.

EnableStreaming

Habilita o deshabilita un objeto SqlBulkCopy para transmitir datos desde un objeto IDataReader.

NotifyAfter

Define el número de filas que se deben procesar antes de generar un evento de notificación.

Métodos

Close()

Cierra la instancia de SqlBulkCopy.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)
WriteToServer(DataRow[])

Copia todas las filas de la matriz DataRow proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServer(DataTable)

Copia todas las filas del objeto DataTable proporcionado en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServer(DataTable, DataRowState)

Copia sólo las filas que coinciden con el estado de fila proporcionado en la DataTable proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServer(DbDataReader)

Copia todas las filas de la matriz DbDataReader proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServer(IDataReader)

Copia todas las filas del objeto IDataReader proporcionado en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(DataRow[])

Versión asincrónica de WriteToServer(DataRow[]), que copia todas las filas de la matriz DataRow suministrada en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(DataRow[], CancellationToken)

Versión asincrónica de WriteToServer(DataRow[]), que copia todas las filas de la matriz DataRow suministrada en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

WriteToServerAsync(DataTable)

Versión asincrónica de WriteToServer(DataTable) que copia todas las finales en la DataTable suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(DataTable, CancellationToken)

Versión asincrónica de WriteToServer(DataTable) que copia todas las finales en la DataTable suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy.

Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

WriteToServerAsync(DataTable, DataRowState)

La versión asincrónica de WriteToServer(DataTable, DataRowState), que copia únicamente las filas que coinciden con el estado de fila proporcionado en el DataTable suministrado en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

La versión asincrónica de WriteToServer(DataTable, DataRowState), que copia únicamente las filas que coinciden con el estado de fila proporcionado en el DataTable suministrado en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

WriteToServerAsync(DbDataReader)

Versión asincrónica de WriteToServer(DbDataReader), que copia todas las filas de la matriz DbDataReader suministrada en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(DbDataReader, CancellationToken)

Versión asincrónica de WriteToServer(DbDataReader), que copia todas las filas de la matriz DbDataReader suministrada en una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(IDataReader)

Versión asincrónica de WriteToServer(IDataReader) que copia todas las finales en la IDataReader suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy.

WriteToServerAsync(IDataReader, CancellationToken)

Versión asincrónica de WriteToServer(IDataReader) que copia todas las finales en la IDataReader suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy.

Token de cancelación que se puede usar para solicitar que se abandone la operación antes de que transcurra el tiempo de espera del comando. Las excepciones se mostrarán a través del objeto Task devuelto.

Eventos

SqlRowsCopied

Se produce cada vez que se ha procesado el número de filas especificado por la propiedad NotifyAfter.

Implementaciones de interfaz explícitas

IDisposable.Dispose()

Libera todos los recursos usados por la instancia actual de la clase SqlBulkCopy.

Se aplica a

Consulte también