SqlBulkCopy Class

Definición

Permite realizar eficazmente la carga masiva de una tabla de SQL Server con datos procedentes de otro origen. Lets you efficiently bulk load a SQL Server table with data from another source.

public sealed class SqlBulkCopy : IDisposable
Herencia
SqlBulkCopy
Implementaciones

Ejemplos

En la siguiente aplicación de consola se demuestra cómo cargar datos mediante la clase SqlBulkCopy.The following console application demonstrates how to load data using the SqlBulkCopy class. En este ejemplo, un SqlDataReader se usa para copiar datos desde el Production.Product tabla en SQL Server AdventureWorks base de datos a una tabla similar en la misma base de datos.In this example, a SqlDataReader is used to copy data from the Production.Product table in the SQL Server AdventureWorks database to a similar table in the same database.

Importante

En 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.This sample will not run unless you have created the work tables as described in Bulk Copy Example Setup. Este código se proporciona para mostrar la sintaxis para usar SqlBulkCopy solo.This code is provided to demonstrate the syntax for using SqlBulkCopy only. 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 Transact-SQL INSERT … SELECT instrucción para copiar los datos.If the source and destination tables are in the same SQL Server instance, it is easier and faster to use a Transact-SQL INSERT … SELECT statement to copy the data.

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 SqlCommand = 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 conocida utilidad de línea de comandos denominada bcp para mover datos de una tabla a otra, ya sea en un solo servidor o entre servidores.Microsoft SQL Server includes a popular command-prompt utility named bcp for moving data from one table to another, whether on a single server or between servers. La SqlBulkCopy clase le permite escribir soluciones de código administrado que proporcionan una funcionalidad similar.The SqlBulkCopy class lets you write managed code solutions that provide similar functionality. Hay otras maneras de cargar datos en una tabla de SQL Server (instrucciones INSERT, por ejemplo), pero SqlBulkCopy ofrece una ventaja de rendimiento significativas sobre ellos.There are other ways to load data into a SQL Server table (INSERT statements, for example), but SqlBulkCopy offers a significant performance advantage over them.

La clase SqlBulkCopy sólo se puede utilizar para escribir datos en tablas SQL Server.The SqlBulkCopy class can be used to write data only to SQL Server tables. Sin embargo, el origen de datos no se limita a SQL Server; puede usarse cualquier origen de datos, siempre que se pueden cargar los datos a un DataTable instancia o leerse con un IDataReader instancia.However, the data source is not limited to SQL Server; any data source can be used, as long as the data can be loaded to a DataTable instance or read with a IDataReader instance.

SqlBulkCopy se producirá un error cuando la carga masiva una DataTable columna de tipo SqlDateTime en un servidor SQL Server se agrega la columna cuyo tipo es uno de los tipos de fecha y hora en SQL Server 2008.SqlBulkCopy will fail when bulk loading a DataTable column of type SqlDateTime into a SQL Server column whose type is one of the date/time types added in SQL Server 2008.

Constructores

SqlBulkCopy(SqlConnection)

Inicializa una nueva instancia de la clase SqlBulkCopy utilizando la instancia abierta especificada de SqlConnection. Initializes a new instance of the SqlBulkCopy class using the specified open instance of SqlConnection.

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

Inicializa una nueva instancia de la clase SqlBulkCopy utilizando la instancia abierta proporcionada de SqlConnection. Initializes a new instance of the SqlBulkCopy class using the supplied existing open instance of SqlConnection. La instancia de SqlBulkCopy se comporta según las opciones proporcionadas en el parámetro copyOptions. The SqlBulkCopy instance behaves according to options supplied in the copyOptions parameter. Si se proporciona una transacción SqlTransaction no nula, las operaciones de copia se realizarán dentro de esa transacción. If a non-null SqlTransaction is supplied, the copy operations will be performed within that transaction.

SqlBulkCopy(String)

Inicializa y abre una nueva instancia de SqlConnection basándose en el parámetro connectionString proporcionado. Initializes and opens a new instance of SqlConnection based on the supplied connectionString. El constructor utiliza SqlConnection para inicializar una nueva instancia de la clase SqlBulkCopy. The constructor uses the SqlConnection to initialize a new instance of the SqlBulkCopy class.

SqlBulkCopy(String, SqlBulkCopyOptions)

Inicializa y abre una nueva instancia de SqlConnection basándose en el parámetro connectionString proporcionado. Initializes and opens a new instance of SqlConnection based on the supplied connectionString. El constructor utiliza esa conexión SqlConnection para inicializar una nueva instancia de la clase SqlBulkCopy. The constructor uses that SqlConnection to initialize a new instance of the SqlBulkCopy class. La instancia de SqlConnection se comporta según las opciones proporcionadas en el parámetro copyOptions. The SqlConnection instance behaves according to options supplied in the copyOptions parameter.

Propiedades

BatchSize

Número de filas de cada lote. Number of rows in each batch. Al final de cada lote, las filas del lote se envían al servidor. At the end of each batch, the rows in the batch are sent to the server.

BulkCopyTimeout

Número de segundos para que la operación se complete antes de que se agote el tiempo de espera. Number of seconds for the operation to complete before it times out.

ColumnMappings

SqlBulkCopyColumnMapping devuelve una colección de elementos. Returns a collection of SqlBulkCopyColumnMapping items. Las asignaciones de columnas definen las relaciones entre las columnas del origen de datos y las columnas del destino. Column mappings define the relationships between columns in the data source and columns in the destination.

DestinationTableName

Nombre de la tabla de destino en el servidor. Name of the destination table on the server.

EnableStreaming

Habilita o deshabilita un objeto SqlBulkCopy para transmitir datos de un objeto IDataReader Enables or disables a SqlBulkCopy object to stream data from an IDataReader object

NotifyAfter

Define el número de filas que se deben procesar antes de generar un evento de notificación. Defines the number of rows to be processed before generating a notification event.

Métodos

Close()

Cierra la instancia SqlBulkCopy. Closes the SqlBulkCopy instance.

Equals(Object)

Determina si el objeto especificado es igual al objeto actual. Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode()

Sirve como la función hash predeterminada. Serves as the default hash function.

(Inherited from Object)
GetType()

Obtiene el Type de la instancia actual. Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone()

Crea una copia superficial del Object actual. Creates a shallow copy of the current Object.

(Inherited from Object)
ToString()

Devuelve una cadena que representa el objeto actual. Returns a string that represents the current object.

(Inherited from Object)
WriteToServer(DataRow[])

Copia todas las filas de la matriz de objetos DataRow proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy. Copies all rows from the supplied DataRow array to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServer(DataTable)

Copia todas las filas de la DataTable proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy. Copies all rows in the supplied DataTable to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

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. Copies only rows that match the supplied row state in the supplied DataTable to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServer(DbDataReader)

Copia todas las filas de la matriz de objetos DbDataReader proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy. Copies all rows from the supplied DbDataReader array to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServer(IDataReader)

Copia todas las filas de la IDataReader proporcionada a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy. Copies all rows in the supplied IDataReader to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServerAsync(DataRow[])

Versión asincrónica de WriteToServer(DataRow[]) que copia todas las finales de la matriz de DataRow suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy. The asynchronous version of WriteToServer(DataRow[]), which copies all rows from the supplied DataRow array to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServerAsync(DataRow[], CancellationToken)

Versión asincrónica de WriteToServer(DataRow[]) que copia todas las finales de la matriz de DataRow suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy. The asynchronous version of WriteToServer(DataRow[]), which copies all rows from the supplied DataRow array to a destination table specified by the DestinationTableName property of the SqlBulkCopy object. 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. The cancellation token can be used to request that the operation be abandoned before the command timeout elapses. Las excepciones se mostrarán a través del objeto de tarea devuelto. Exceptions will be reported via the returned Task object.

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. The asynchronous version of WriteToServer(DataTable), which copies all rows in the supplied DataTable to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

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. The asynchronous version of WriteToServer(DataTable), which copies all rows in the supplied DataTable to a destination table specified by the DestinationTableName property of the SqlBulkCopy object. 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. The cancellation token can be used to request that the operation be abandoned before the command timeout elapses. Las excepciones se mostrarán a través del objeto de tarea devuelto. Exceptions will be reported via the returned Task object.

WriteToServerAsync(DataTable, DataRowState)

Versión asincrónica de WriteToServer(DataTable, DataRowState) que copia solamente filas que coinciden con el estado de fila proporcionado en la tabla de DataTable suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy. The asynchronous version of WriteToServer(DataTable, DataRowState), which copies only rows that match the supplied row state in the supplied DataTable to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

Versión asincrónica de WriteToServer(DataTable, DataRowState) que copia solamente filas que coinciden con el estado de fila proporcionado en la tabla de DataTable suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy. The asynchronous version of WriteToServer(DataTable, DataRowState), which copies only rows that match the supplied row state in the supplied DataTable to a destination table specified by the DestinationTableName property of the SqlBulkCopy object. 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. The cancellation token can be used to request that the operation be abandoned before the command timeout elapses. Las excepciones se mostrarán a través del objeto de tarea devuelto. Exceptions will be reported via the returned Task object.

WriteToServerAsync(DbDataReader)

Versión asincrónica de WriteToServer(DbDataReader) que copia todas las finales de la matriz de DbDataReader suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy. The asynchronous version of WriteToServer(DbDataReader), which copies all rows from the supplied DbDataReader array to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

WriteToServerAsync(DbDataReader, CancellationToken)

Versión asincrónica de WriteToServer(DbDataReader) que copia todas las finales de la matriz de DbDataReader suministrada a una tabla de destino que especifica la propiedad DestinationTableName del objeto SqlBulkCopy. The asynchronous version of WriteToServer(DbDataReader), which copies all rows from the supplied DbDataReader array to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

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. The asynchronous version of WriteToServer(IDataReader), which copies all rows in the supplied IDataReader to a destination table specified by the DestinationTableName property of the SqlBulkCopy object.

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. The asynchronous version of WriteToServer(IDataReader), which copies all rows in the supplied IDataReader to a destination table specified by the DestinationTableName property of the SqlBulkCopy object. 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. The cancellation token can be used to request that the operation be abandoned before the command timeout elapses. Las excepciones se mostrarán a través del objeto de tarea devuelto. Exceptions will be reported via the returned Task object.

Eventos

SqlRowsCopied

Se produce cada vez que se ha procesado el número de filas especificado por la propiedad NotifyAfter. Occurs every time that the number of rows specified by the NotifyAfter property have been processed.

Implementaciones de interfaz explícitas

IDisposable.Dispose()

Libera todos los recursos usados por la instancia actual de la clase SqlBulkCopy. Releases all resources used by the current instance of the SqlBulkCopy class.

Se aplica a