Condividi tramite


SqlBulkCopy.WriteToServer Metodo

Definizione

Overload

WriteToServer(DbDataReader)

Copia tutte le righe dalla matrice DbDataReader fornita in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto SqlBulkCopy.

WriteToServer(DataRow[])

Copia tutte le righe dalla matrice DataRow fornita in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto SqlBulkCopy.

WriteToServer(DataTable)

Copia tutte le righe nell'oggetto DataTable indicato in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto SqlBulkCopy.

WriteToServer(IDataReader)

Copia tutte le righe nell'oggetto IDataReader indicato in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto SqlBulkCopy.

WriteToServer(DataTable, DataRowState)

Copia solo le righe corrispondenti allo stato di riga specificato nell'oggetto DataTable fornito in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto SqlBulkCopy.

WriteToServer(DbDataReader)

Copia tutte le righe dalla matrice DbDataReader fornita in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto 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)

Parametri

reader
DbDataReader

Oggetto DbDataReader le cui righe vengono copiate nella tabella di destinazione.

Eccezioni

Non SqlBulkCopyColumnOrderHint è stato specificato un nome di colonna di destinazione valido.

Si applica a

WriteToServer(DataRow[])

Copia tutte le righe dalla matrice DataRow fornita in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto 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())

Parametri

rows
DataRow[]

Matrice di oggetti DataRow che verranno copiati nella tabella di destinazione.

Eccezioni

Non SqlBulkCopyColumnOrderHint è stato specificato un nome di colonna di destinazione valido.

Esempio

L'applicazione console seguente illustra come caricare in blocco i dati da una DataRow matrice. La tabella di destinazione è una tabella nel database AdventureWorks .

In questo esempio viene creato un oggetto DataTable in fase di esecuzione. Una singola riga viene selezionata dall'oggetto DataTable da copiare nella tabella di destinazione.

Importante

Questo esempio non verrà eseguito a meno che non siano state create le tabelle di lavoro, come descritto in Installazione di esempio di copia bulk. Il codice viene fornito solo per illustrare la sintassi relativa all'uso di SqlBulkCopy. Se le tabelle di origine e di destinazione si trovano nella stessa istanza di SQL Server, è più semplice e veloce usare un'istruzione Transact-SQL INSERT … SELECT per copiare i dati.

Commenti

Anche se l'operazione di copia bulk è in corso, la destinazione SqlConnection associata è occupata e non è possibile eseguire altre operazioni sulla connessione.

L'insieme ColumnMappings esegue il DataRow mapping dalle colonne alla tabella del database di destinazione.

Si applica a

WriteToServer(DataTable)

Copia tutte le righe nell'oggetto DataTable indicato in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto 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)

Parametri

table
DataTable

Oggetto DataTable le cui righe vengono copiate nella tabella di destinazione.

Eccezioni

Non SqlBulkCopyColumnOrderHint è stato specificato un nome di colonna di destinazione valido.

Esempio

L'applicazione console seguente illustra come caricare in blocco i dati da un DataTableoggetto . La tabella di destinazione è una tabella nel database AdventureWorks .

In questo esempio viene creato un oggetto DataTable in fase di esecuzione ed è l'origine dell'operazione SqlBulkCopy .

Importante

Questo esempio non verrà eseguito a meno che non siano state create le tabelle di lavoro, come descritto in Installazione di esempio di copia bulk. Il codice viene fornito solo per illustrare la sintassi relativa all'uso di SqlBulkCopy. Se le tabelle di origine e di destinazione si trovano nella stessa istanza di SQL Server, è più semplice e veloce usare un'istruzione Transact-SQL INSERT … SELECT per copiare i dati.

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

Commenti

Tutte le righe nella DataTable tabella di destinazione vengono copiate, ad eccezione di quelle eliminate.

Anche se l'operazione di copia bulk è in corso, la destinazione SqlConnection associata è occupata e non è possibile eseguire altre operazioni sulla connessione.

L'insieme ColumnMappings esegue il DataTable mapping dalle colonne alla tabella del database di destinazione.

Vedi anche

Si applica a

WriteToServer(IDataReader)

Copia tutte le righe nell'oggetto IDataReader indicato in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto 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)

Parametri

reader
IDataReader

Oggetto IDataReader le cui righe vengono copiate nella tabella di destinazione.

Eccezioni

Non SqlBulkCopyColumnOrderHint è stato specificato un nome di colonna di destinazione valido.

Esempio

L'applicazione console seguente illustra come caricare in blocco i dati da un SqlDataReaderoggetto . La tabella di destinazione è una tabella nel database AdventureWorks .

Importante

Questo esempio non verrà eseguito a meno che non siano state create le tabelle di lavoro, come descritto in Installazione di esempio di copia bulk. Il codice viene fornito solo per illustrare la sintassi relativa all'uso di SqlBulkCopy. Se le tabelle di origine e di destinazione si trovano nella stessa istanza di SQL Server, è più semplice e veloce usare un'istruzione Transact-SQL INSERT … SELECT per copiare i dati.

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

Commenti

L'operazione di copia inizia alla riga successiva disponibile nel lettore. La maggior parte del tempo, il lettore è stato appena restituito da ExecuteReader() o una chiamata simile, quindi la riga successiva disponibile è la prima riga. Per elaborare più risultati, chiamare il lettore dati e chiamare NextResult()WriteToServer di nuovo.

Si noti che usando WriteToServer modifica lo stato del lettore. Il metodo viene chiamato Read() finché non restituisce false, l'operazione viene interrotta o si verifica un errore. Ciò significa che il lettore dati sarà in uno stato diverso, probabilmente alla fine del set di risultati, al WriteToServer termine dell'operazione.

Anche se l'operazione di copia bulk è in corso, la destinazione SqlConnection associata è occupata e non è possibile eseguire altre operazioni sulla connessione.

La ColumnMappings raccolta esegue il mapping delle colonne del lettore dati alla tabella del database di destinazione.

Si applica a

WriteToServer(DataTable, DataRowState)

Copia solo le righe corrispondenti allo stato di riga specificato nell'oggetto DataTable fornito in una tabella di destinazione specificata dalla proprietà DestinationTableName dell'oggetto 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)

Parametri

table
DataTable

Oggetto DataTable le cui righe vengono copiate nella tabella di destinazione.

rowState
DataRowState

Valore ottenuto dall'enumerazione DataRowState. Nella destinazione vengono copiate solo le righe che corrispondono allo stato della riga fornito.

Eccezioni

Non SqlBulkCopyColumnOrderHint è stato specificato un nome di colonna di destinazione valido.

Esempio

L'applicazione console seguente illustra come caricare in blocco solo le righe in uno DataTable stato specificato. In questo caso vengono aggiunte solo righe invariate. La tabella di destinazione è una tabella nel database AdventureWorks .

In questo esempio viene creato un oggetto DataTable in fase di esecuzione e vengono aggiunte tre righe. Prima dell'esecuzione del WriteToServer metodo, viene modificata una delle righe. Il WriteToServer metodo viene chiamato con un DataRowState.UnchangedrowState argomento, quindi solo le due righe invariate vengono copiate in blocco nella destinazione.

Importante

Questo esempio non verrà eseguito a meno che non siano state create le tabelle di lavoro, come descritto in Installazione di esempio di copia bulk. Il codice viene fornito solo per illustrare la sintassi relativa all'uso di SqlBulkCopy. Se le tabelle di origine e di destinazione si trovano nella stessa istanza di SQL Server, è più semplice e veloce usare un'istruzione Transact-SQL INSERT … SELECT per copiare i dati.

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

Commenti

Solo le righe negli DataTable stati indicati nell'argomento rowState e non sono state eliminate vengono copiate nella tabella di destinazione.

Nota

Se Deleted specificato, eventuali UnchangedAddedrighe , e Modified verranno copiate anche nel server. Nessuna eccezione verrà generata.

Anche se l'operazione di copia bulk è in corso, la destinazione SqlConnection associata è occupata e non è possibile eseguire altre operazioni sulla connessione.

L'insieme ColumnMappings esegue il DataTable mapping dalle colonne alla tabella del database di destinazione.

Si applica a