Share via


Enkelvoudige bulk kopieeroperaties

ADO.NET downloaden

De eenvoudigste manier om een sql Server-bulkkopiebewerking uit te voeren, is door één bewerking uit te voeren op een database. Standaard wordt een bulk kopieerbewerking uitgevoerd als een geïsoleerde bewerking: de kopieerbewerking vindt plaats op een niet-getransactionaliseerde manier, zonder de mogelijkheid om hem terug te draaien.

Opmerking

Als u de bulkkopie geheel of gedeeltelijk wilt terugdraaien wanneer er een fout optreedt, kunt u een SqlBulkCopybeheerde transactie gebruiken of de bulkkopiebewerking uitvoeren binnen een bestaande transactie. SqlBulkCopy werkt ook met System.Transactions wanneer de verbinding is opgenomen (impliciet of expliciet) in een System.Transactions-transactie.

Zie Transactie- en bulkkopiebewerkingen voor meer informatie.

De algemene stappen voor het uitvoeren van een bulksgewijs kopiëren zijn als volgt:

  1. Maak verbinding met de bronserver en haal de gegevens op die moeten worden gekopieerd. Gegevens kunnen ook afkomstig zijn van andere bronnen, als deze kunnen worden opgehaald uit een IDataReader of DataTable object.

  2. Maak verbinding met de doelserver (tenzij u wilt dat SqlBulkCopy een verbinding voor u tot stand brengt).

  3. Maak een SqlBulkCopy object en stel de benodigde eigenschappen in.

  4. Stel de eigenschap DestinationTableName in om de doeltabel voor de bulksgewijze invoegbewerking aan te geven.

  5. Roep een van de WriteToServer-methoden aan.

  6. Werk desgewenst eigenschappen bij en roep WriteToServer indien nodig opnieuw aan.

  7. Roep Close aan, of verpak de bulkkopiebewerkingen binnen een Using instructie.

Waarschuwing

Het is raadzaam dat de gegevenstypen van de bron- en doelkolom overeenkomen. Als de gegevenstypen niet overeenkomen, probeert SqlBulkCopy elke bronwaarde te converteren naar het doelgegevenstype, met behulp van de regels die worden gebruikt door Value. Conversies kunnen van invloed zijn op de prestaties en kunnen ook leiden tot onverwachte fouten. Een gegevenstype kan bijvoorbeeld Double meestal worden geconverteerd naar een Decimal gegevenstype, maar niet altijd.

Example

In de volgende consoletoepassing ziet u hoe u gegevens laadt met behulp van de SqlBulkCopy klasse. In dit voorbeeld wordt er een SqlDataReader gebruikt voor het kopiëren van gegevens uit de tabel Production.Product in de SQL Server AdventureWorks-database naar een vergelijkbare tabel in dezelfde database.

Belangrijk

Dit voorbeeld wordt alleen uitgevoerd als u de werktabellen hebt gemaakt, zoals beschreven in de voorbeeldinstallatie voor bulksgewijs kopiëren. Deze code wordt verstrekt om alleen de syntaxis voor het gebruik van SqlBulkCopy te demonstreren. Als de bron- en doeltabellen zich in hetzelfde SQL Server-exemplaar bevinden, is het eenvoudiger en sneller om een Transact-SQL-instructie INSERT ... SELECT te gebruiken om de gegevens te kopiëren.

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

            // 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);
                        // Print the number of rows processed using the 
                        // RowsCopied property.
                        Console.WriteLine("{0} rows were processed.",
                            bulkCopy.RowsCopied);
                    }
                    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;";
    }
}

Een bulkkopiebewerking uitvoeren met behulp van Transact-SQL en de opdrachtklasse

In het volgende voorbeeld ziet u hoe u de ExecuteNonQuery methode gebruikt om de INSTRUCTIE BULK INSERT uit te voeren.

Opmerking

Het bestandspad voor de gegevensbron is relatief ten opzichte van de server. Het serverproces moet toegang hebben tot dat pad om de bulkkopiebewerking te kunnen voltooien.

using (SqlConnection connection = New SqlConnection(connectionString))  
{  
string queryString =  "BULK INSERT Northwind.dbo.[Order Details] " +  
    "FROM 'f:\mydata\data.tbl' " +  
    "WITH ( FORMATFILE='f:\mydata\data.fmt' )";  
connection.Open();  
SqlCommand command = new SqlCommand(queryString, connection);  
  
command.ExecuteNonQuery();  
}  

Volgende stappen