SqlBulkCopy.WriteToServer Método

Definición

Copia todas las filas de un origen de datos a una tabla de destino especificada por la propiedad DestinationTableName del objeto SqlBulkCopy.

Sobrecargas

WriteToServer(DataTable, DataRowState)

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

WriteToServer(IDataReader)

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

WriteToServer(DataTable)

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

WriteToServer(DbDataReader)

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

WriteToServer(DataRow[])

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

Comentarios

Si se deshabilitan varios conjuntos de resultados activos (MARS), WriteToServer hace que la conexión esté ocupada. Si MARS está habilitado, puede intercalar llamadas a WriteToServer con otros comandos en la misma conexión.

WriteToServer(DataTable, DataRowState)

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

C#
public void WriteToServer (System.Data.DataTable table, System.Data.DataRowState rowState);

Parámetros

table
DataTable

Un DataTable cuyas filas se copiarán en la tabla de destino.

rowState
DataRowState

Valor de la enumeración DataRowState. Solo las filas que coinciden con el estado de fila se copian en el destino.

Ejemplos

La siguiente aplicación de consola muestra cómo cargar de forma masiva solo las filas de un DataTable que coinciden con un estado especificado. En este caso, solo se agregan filas sin cambios. La tabla de destino es una tabla de la base de datos de AdventureWorks.

En este ejemplo, se crea un DataTable en tiempo de ejecución y se agregan tres filas. Antes de ejecutar el método WriteToServer, se edita una de las filas. Se llama al método WriteToServer con un argumento DataRowState.UnchangedrowState, por lo que solo se copian masivamente las dos filas sin cambios en el destino.

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 solo 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.

C#
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a connection to the AdventureWorks database.
        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            connection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                connection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

            // Create a table with some rows.
            DataTable newProducts = MakeTable();

            // Make a change to one of the rows in the DataTable.
            DataRow row = newProducts.Rows[0];
            row.BeginEdit();
            row["Name"] = "AAA";
            row.EndEdit();

            // Create the SqlBulkCopy object.
            // Note that the column positions in the source DataTable
            // match the column positions in the destination table so
            // there is no need to map columns.
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                try
                {
                    // Write unchanged rows from the source to the destination.
                    bulkCopy.WriteToServer(newProducts, DataRowState.Unchanged);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            // 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 DataTable MakeTable()
        // Create a new DataTable named NewProducts.
    {
        DataTable newProducts = new DataTable("NewProducts");

        // Add three column objects to the table.
        DataColumn productID = new DataColumn();
        productID.DataType = System.Type.GetType("System.Int32");
        productID.ColumnName = "ProductID";
        productID.AutoIncrement = true;
        newProducts.Columns.Add(productID);

        DataColumn productName = new DataColumn();
        productName.DataType = System.Type.GetType("System.String");
        productName.ColumnName = "Name";
        newProducts.Columns.Add(productName);

        DataColumn productNumber = new DataColumn();
        productNumber.DataType = System.Type.GetType("System.String");
        productNumber.ColumnName = "ProductNumber";
        newProducts.Columns.Add(productNumber);

        // Create an array for DataColumn objects.
        DataColumn[] keys = new DataColumn[1];
        keys[0] = productID;
        newProducts.PrimaryKey = keys;

        // Add some new rows to the collection.
        DataRow row = newProducts.NewRow();
        row["Name"] = "CC-101-WH";
        row["ProductNumber"] = "Cyclocomputer - White";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-BK";
        row["ProductNumber"] = "Cyclocomputer - Black";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-ST";
        row["ProductNumber"] = "Cyclocomputer - Stainless";
        newProducts.Rows.Add(row);
        newProducts.AcceptChanges();

        // Return the new DataTable.
        return newProducts;
    }
    private static string GetConnectionString()
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

Comentarios

Solo las filas de la DataTable que se encuentran en los estados indicados en el argumento rowState y que no se han eliminado se copian en la tabla de destino.

Nota

Si se especifica Deleted, las filas Unchanged, Addedy Modified también se copiarán en el servidor. No se generará ninguna excepción.

Aunque la operación de copia masiva está en curso, la SqlConnection de destino asociada está ocupada y no se puede realizar ninguna otra operación en la conexión.

La colección ColumnMappings se asigna de las columnas DataTable a la tabla de base de datos de destino.

Consulte también

Se aplica a

.NET Framework 4.8.1 otras versiones
Producto Versiones
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0

WriteToServer(IDataReader)

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

C#
public void WriteToServer (System.Data.IDataReader reader);

Parámetros

reader
IDataReader

Un IDataReader cuyas filas se copiarán en la tabla de destino.

Ejemplos

En la siguiente aplicación de consola se muestra cómo cargar datos de forma masiva desde un SqlDataReader. La tabla de destino es una tabla de la base de datos de AdventureWorks.

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 solo 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.

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

            // Set up the bulk copy object using a connection string.
            // 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))
            {
                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;";
    }
}

Comentarios

La operación de copia se inicia en la siguiente fila disponible en el lector. La mayoría de las veces, el lector acaba de devolverlo ExecuteReader o una llamada similar, por lo que la siguiente fila disponible es la primera fila. Para procesar varios resultados, llame a NextResult en el lector de datos y vuelva a llamar a WriteToServer.

Tenga en cuenta que el uso de WriteToServer modifica el estado del lector. El método llamará a Read hasta que devuelva false, se anula la operación o se produce un error. Esto significa que el lector de datos estará en un estado diferente, probablemente al final del conjunto de resultados, cuando se complete la operación de WriteToServer.

Aunque la operación de copia masiva está en curso, la SqlConnection de destino asociada está ocupada y no se puede realizar ninguna otra operación en la conexión.

La colección ColumnMappings se asigna de las columnas del lector de datos a la tabla de base de datos de destino.

Consulte también

Se aplica a

.NET Framework 4.8.1 otras versiones
Producto Versiones
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0

WriteToServer(DataTable)

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

C#
public void WriteToServer (System.Data.DataTable table);

Parámetros

table
DataTable

Un DataTable cuyas filas se copiarán en la tabla de destino.

Ejemplos

En la siguiente aplicación de consola se muestra cómo cargar datos de forma masiva desde un DataTable. La tabla de destino es una tabla de la base de datos de AdventureWorks.

En este ejemplo, se crea un DataTable en tiempo de ejecución y es el origen de la operación de SqlBulkCopy.

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 solo 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.

C#
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a connection to the AdventureWorks database.
        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            connection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                connection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

            // Create a table with some rows.
            DataTable newProducts = MakeTable();

            // Create the SqlBulkCopy object.
            // Note that the column positions in the source DataTable
            // match the column positions in the destination table so
            // there is no need to map columns.
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                try
                {
                    // Write from the source to the destination.
                    bulkCopy.WriteToServer(newProducts);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            // 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 DataTable MakeTable()
        // Create a new DataTable named NewProducts.
    {
        DataTable newProducts = new DataTable("NewProducts");

        // Add three column objects to the table.
        DataColumn productID = new DataColumn();
        productID.DataType = System.Type.GetType("System.Int32");
        productID.ColumnName = "ProductID";
        productID.AutoIncrement = true;
        newProducts.Columns.Add(productID);

        DataColumn productName = new DataColumn();
        productName.DataType = System.Type.GetType("System.String");
        productName.ColumnName = "Name";
        newProducts.Columns.Add(productName);

        DataColumn productNumber = new DataColumn();
        productNumber.DataType = System.Type.GetType("System.String");
        productNumber.ColumnName = "ProductNumber";
        newProducts.Columns.Add(productNumber);

        // Create an array for DataColumn objects.
        DataColumn[] keys = new DataColumn[1];
        keys[0] = productID;
        newProducts.PrimaryKey = keys;

        // Add some new rows to the collection.
        DataRow row = newProducts.NewRow();
        row["Name"] = "CC-101-WH";
        row["ProductNumber"] = "Cyclocomputer - White";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-BK";
        row["ProductNumber"] = "Cyclocomputer - Black";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-ST";
        row["ProductNumber"] = "Cyclocomputer - Stainless";
        newProducts.Rows.Add(row);
        newProducts.AcceptChanges();

        // Return the new DataTable.
        return newProducts;
    }
    private static string GetConnectionString()
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

Comentarios

Todas las filas del DataTable se copian en la tabla de destino, excepto las que se han eliminado.

Aunque la operación de copia masiva está en curso, la SqlConnection de destino asociada está ocupada y no se puede realizar ninguna otra operación en la conexión.

La colección ColumnMappings se asigna de las columnas DataTable a la tabla de base de datos de destino.

Consulte también

Se aplica a

.NET Framework 4.8.1 otras versiones
Producto Versiones
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0

WriteToServer(DbDataReader)

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

C#
public void WriteToServer (System.Data.Common.DbDataReader reader);

Parámetros

reader
DbDataReader

Un DbDataReader cuyas filas se copiarán en la tabla de destino.

Se aplica a

.NET Core 1.1 otras versiones
Producto Versiones
.NET Core 1.0, Core 1.1
.NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0

WriteToServer(DataRow[])

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

C#
public void WriteToServer (System.Data.DataRow[] rows);

Parámetros

rows
DataRow[]

Matriz de DataRow objetos que se copiarán en la tabla de destino.

Ejemplos

En la siguiente aplicación de consola se muestra cómo cargar datos de forma masiva desde una matriz de DataRow. La tabla de destino es una tabla de la base de datos de AdventureWorks.

En este ejemplo, se crea un DataTable en tiempo de ejecución. Se selecciona una sola fila de la DataTable para copiar en la tabla de destino.

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 solo 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.

C#
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a connection to the AdventureWorks database.
        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            connection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                connection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

            // Create a table with some rows.
            DataTable newProducts = MakeTable();

            // Get a reference to a single row in the table.
            DataRow[] rowArray = newProducts.Select(
                "Name='CC-101-BK'");

            // Create the SqlBulkCopy object.
            // Note that the column positions in the source DataTable
            // match the column positions in the destination table so
            // there is no need to map columns.
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                try
                {
                    // Write the array of rows to the destination.
                    bulkCopy.WriteToServer(rowArray);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            // 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 DataTable MakeTable()
        // Create a new DataTable named NewProducts.
    {
        DataTable newProducts = new DataTable("NewProducts");

        // Add three column objects to the table.
        DataColumn productID = new DataColumn();
        productID.DataType = System.Type.GetType("System.Int32");
        productID.ColumnName = "ProductID";
        productID.AutoIncrement = true;
        newProducts.Columns.Add(productID);

        DataColumn productName = new DataColumn();
        productName.DataType = System.Type.GetType("System.String");
        productName.ColumnName = "Name";
        newProducts.Columns.Add(productName);

        DataColumn productNumber = new DataColumn();
        productNumber.DataType = System.Type.GetType("System.String");
        productNumber.ColumnName = "ProductNumber";
        newProducts.Columns.Add(productNumber);

        // Create an array for DataColumn objects.
        DataColumn[] keys = new DataColumn[1];
        keys[0] = productID;
        newProducts.PrimaryKey = keys;

        // Add some new rows to the collection.
        DataRow row = newProducts.NewRow();
        row["Name"] = "CC-101-WH";
        row["ProductNumber"] = "Cyclocomputer - White";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-BK";
        row["ProductNumber"] = "Cyclocomputer - Black";

        newProducts.Rows.Add(row);
        row = newProducts.NewRow();
        row["Name"] = "CC-101-ST";
        row["ProductNumber"] = "Cyclocomputer - Stainless";
        newProducts.Rows.Add(row);
        newProducts.AcceptChanges();

        // Return the new DataTable.
        return newProducts;
    }
    private static string GetConnectionString()
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

Comentarios

Aunque la operación de copia masiva está en curso, la SqlConnection de destino asociada está ocupada y no se puede realizar ninguna otra operación en la conexión.

La colección ColumnMappings se asigna de las columnas DataRow a la tabla de base de datos de destino.

Consulte también

Se aplica a

.NET Framework 4.8.1 otras versiones
Producto Versiones
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0