Partilhar via


SqlBulkCopy.WriteToServer Método

Definição

Sobrecargas

WriteToServer(DbDataReader)

Copia todas as linhas da matriz DbDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServer(DataRow[])

Copia todas as linhas da matriz DataRow fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServer(DataTable)

Copia todas as linhas da DataTable fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServer(IDataReader)

Copia todas as linhas da IDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServer(DataTable, DataRowState)

Copia apenas linhas que correspondem ao estado de linha fornecido no DataTable fornecido para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

WriteToServer(DbDataReader)

Copia todas as linhas da matriz DbDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

public:
 void WriteToServer(System::Data::Common::DbDataReader ^ reader);
public void WriteToServer (System.Data.Common.DbDataReader reader);
member this.WriteToServer : System.Data.Common.DbDataReader -> unit
Public Sub WriteToServer (reader As DbDataReader)

Parâmetros

reader
DbDataReader

Um DbDataReader cujas linhas serão copiadas para a tabela de destino.

Exceções

Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.

Aplica-se a

WriteToServer(DataRow[])

Copia todas as linhas da matriz DataRow fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

public:
 void WriteToServer(cli::array <System::Data::DataRow ^> ^ rows);
public void WriteToServer (System.Data.DataRow[] rows);
member this.WriteToServer : System.Data.DataRow[] -> unit
Public Sub WriteToServer (rows As DataRow())

Parâmetros

rows
DataRow[]

Uma matriz de objetos DataRow que será copiada para a tabela de destino.

Exceções

Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.

Exemplos

O aplicativo de console a seguir demonstra como carregar dados em massa de uma DataRow matriz. A tabela de destino é uma tabela no banco de dados AdventureWorks .

Neste exemplo, um DataTable é criado em tempo de execução. Uma única linha é selecionada no DataTable para copiar para a tabela de destino.

Importante

Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT para copiar os dados.

Comentários

Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.

A ColumnMappings coleção mapeia das DataRow colunas para a tabela de banco de dados de destino.

Aplica-se a

WriteToServer(DataTable)

Copia todas as linhas da DataTable fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

public:
 void WriteToServer(System::Data::DataTable ^ table);
public void WriteToServer (System.Data.DataTable table);
member this.WriteToServer : System.Data.DataTable -> unit
Public Sub WriteToServer (table As DataTable)

Parâmetros

table
DataTable

Um DataTable cujas linhas serão copiadas para a tabela de destino.

Exceções

Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.

Exemplos

O aplicativo console a seguir demonstra como carregar dados em massa de um DataTable. A tabela de destino é uma tabela no banco de dados AdventureWorks .

Neste exemplo, um DataTable é criado em tempo de execução e é a origem da SqlBulkCopy operação.

Importante

Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT para copiar os dados.

using Microsoft.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;";
    }
}

Comentários

Todas as linhas no DataTable são copiadas para a tabela de destino, exceto aquelas que foram excluídas.

Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.

A ColumnMappings coleção mapeia das DataTable colunas para a tabela de banco de dados de destino.

Confira também

Aplica-se a

WriteToServer(IDataReader)

Copia todas as linhas da IDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

public:
 void WriteToServer(System::Data::IDataReader ^ reader);
public void WriteToServer (System.Data.IDataReader reader);
member this.WriteToServer : System.Data.IDataReader -> unit
Public Sub WriteToServer (reader As IDataReader)

Parâmetros

reader
IDataReader

Um IDataReader cujas linhas serão copiadas para a tabela de destino.

Exceções

Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.

Exemplos

O aplicativo de console a seguir demonstra como carregar dados em massa de um SqlDataReader. A tabela de destino é uma tabela no banco de dados AdventureWorks .

Importante

Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT para copiar os dados.

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

            // 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;";
    }
}

Comentários

A operação de cópia começa na próxima linha disponível no leitor. Na maioria das vezes, o leitor acabou de ser retornado por ExecuteReader() ou uma chamada semelhante, portanto, a próxima linha disponível é a primeira linha. Para processar vários resultados, chame NextResult() no leitor de dados e chame WriteToServer novamente.

Observe que usar WriteToServer modifica o estado do leitor. O método chamará Read() até que retorne false, a operação seja anulada ou ocorra um erro. Isso significa que o leitor de dados estará em um estado diferente, provavelmente no final do conjunto de resultados, quando a WriteToServer operação for concluída.

Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.

A ColumnMappings coleção mapeia das colunas do leitor de dados para a tabela de banco de dados de destino.

Aplica-se a

WriteToServer(DataTable, DataRowState)

Copia apenas linhas que correspondem ao estado de linha fornecido no DataTable fornecido para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.

public:
 void WriteToServer(System::Data::DataTable ^ table, System::Data::DataRowState rowState);
public void WriteToServer (System.Data.DataTable table, System.Data.DataRowState rowState);
member this.WriteToServer : System.Data.DataTable * System.Data.DataRowState -> unit
Public Sub WriteToServer (table As DataTable, rowState As DataRowState)

Parâmetros

table
DataTable

Um DataTable cujas linhas serão copiadas para a tabela de destino.

rowState
DataRowState

Um valor da enumeração DataRowState. Somente as linhas que correspondem ao estado de linha são copiadas para o destino.

Exceções

Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.

Exemplos

O aplicativo console a seguir demonstra como carregar em massa apenas as linhas em um DataTable que correspondem a um estado especificado. Nesse caso, somente linhas inalteradas são adicionadas. A tabela de destino é uma tabela no banco de dados AdventureWorks .

Neste exemplo, um DataTable é criado em tempo de execução e três linhas são adicionadas a ele. Antes que o WriteToServer método seja executado, uma das linhas é editada. O WriteToServer método é chamado com um DataRowState.UnchangedrowState argumento , portanto, somente as duas linhas inalteradas são copiadas em massa para o destino.

Importante

Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT para copiar os dados.

using Microsoft.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;";
    }
}

Comentários

Somente as DataTable linhas no que estão nos estados indicados no rowState argumento e não foram excluídas são copiadas para a tabela de destino.

Observação

Se Deleted for especificado, as Unchangedlinhas , Addede Modified também serão copiadas para o servidor. Nenhuma exceção será gerada.

Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.

A ColumnMappings coleção mapeia das DataTable colunas para a tabela de banco de dados de destino.

Aplica-se a