Freigeben über


Einzelne Massenkopiervorgänge

Herunterladen von ADO.NET

Die einfachste Herangehensweise an einen SQL Server-Massenkopiervorgang ist das Durchführen eines einzelnen Vorgangs für eine Datenbank. Standardmäßig wird ein Massenkopiervorgang als isolierter Vorgang ausgeführt: Der Kopiervorgang erfolgt in nicht transaktionaler Weise, ohne Möglichkeit zum Rollback.

Hinweis

Wenn Sie für den Massenkopiervorgang beim Auftreten eines Fehlers einen teilweisen oder vollständigen Rollback ausführen müssen, können Sie entweder eine von SqlBulkCopy verwaltete Transaktion verwenden oder den Massenkopiervorgang innerhalb einer vorhandenen Transaktion ausführen. SqlBulkCopy funktioniert auch mit System.Transactions, wenn die Verbindung (implizit oder explizit) in eine System.Transactions-Transaktion eingetragen wurde.

Weitere Informationen finden Sie unter Transaktionen und Massenkopiervorgänge.

Dies sind die allgemeinen Schritte zum Durchführen eines Massenkopiervorgangs:

  1. Herstellen einer Verbindung mit dem Quellserver und Abrufen der zu kopierenden Daten. Die Daten können auch aus einer anderen Quelle stammen, solange sie aus einem IDataReader- oder DataTable-Objekt abgerufen werden können.

  2. Stellen Sie eine Verbindung mit dem Zielserver her (sofern die Verbindung nicht von SqlBulkCopy hergestellt werden soll).

  3. Erstellen Sie ein SqlBulkCopy-Objekt, und nehmen Sie die erforderlichen Einstellungen vor.

  4. Legen Sie die DestinationTableName-Eigenschaft fest, um die Zieltabelle für den Masseneinfügevorgang anzugeben.

  5. Rufen Sie eine der WriteToServer-Methoden auf.

  6. Optional können Sie Eigenschaften aktualisieren und WriteToServer bei Bedarf erneut aufrufen.

  7. Rufen sie Close auf, oder umschließen Sie die Massenkopiervorgänge mit einer Using-Anweisung.

Achtung

Wir empfehlen die Verwendung gleicher Datentypen für Quell- und Zielspalten. Wenn die Datentypen nicht übereinstimmen, versucht SqlBulkCopy, die einzelnen Quellwerte anhand der vom Value angewendeten Regeln in den Zieldatentyp zu konvertieren. Konvertierungen wirken sich negativ auf die Leistung aus und können außerdem zu unerwarteten Fehlern führen. Beispielsweise kann ein Datentyp Double in den meisten Fällen in den Datentyp Decimal konvertiert werden, aber nicht immer.

Beispiel

Die folgende Konsolenanwendung zeigt das Laden von Daten mithilfe der Klasse SqlBulkCopy. In diesem Beispiel werden in der SQL Server-Datenbank AdventureWorks unter Verwendung von SqlDataReader Daten aus der Tabelle Production.Product in eine ähnliche Tabelle derselben Datenbank kopiert.

Wichtig

Dieses Beispiel wird nur ausgeführt, wenn Sie die Arbeitstabellen zuvor wie unter Massenkopierbeispiel-Einrichtung beschrieben erstellt haben. Der angegebene Code dient nur zur Demonstration der Syntax für die Verwendung von SqlBulkCopy. Wenn sich die Quell- und Zieltabellen in der gleichen SQL Server-Instanz befinden, ist die Verwendung einer Transact-SQL-Anweisung INSERT … SELECT zum Kopieren der Daten einfacher und schneller.

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

Durchführen eines Massenkopiervorgangs mithilfe von Transact-SQL und der Command-Klasse

Das folgende Beispiel zeigt die Verwendung der Methode ExecuteNonQuery zum Ausführen der Anweisung BULK INSERT.

Hinweis

Der Dateipfad für die Datenquelle ist relativ zum Server. Der Serverprozess muss Zugriff auf diesen Pfad besitzen, damit der Massenkopiervorgang erfolgreich ausgeführt werden kann.

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

Nächste Schritte