SqlBulkCopyOptions Enumeration

Definition

Bitweises Kennzeichen, das eine oder mehrere Optionen angibt, die mit einer Instanz von SqlBulkCopy verwendet werden sollen.

Diese Enumeration unterstützt eine bitweise Kombination ihrer Memberwerte.

public enum class SqlBulkCopyOptions
[System.Flags]
public enum SqlBulkCopyOptions
[<System.Flags>]
type SqlBulkCopyOptions = 
Public Enum SqlBulkCopyOptions
Vererbung
SqlBulkCopyOptions
Attribute

Felder

AllowEncryptedValueModifications 64

Wenn angegeben, ermöglicht AllowEncryptedValueModifications das Massenkopieren verschlüsselter Daten zwischen Tabellen oder Datenbanken, ohne die Daten zu entschlüsseln. Normalerweise würde eine Anwendung Daten aus verschlüsselten Spalten aus einer Tabelle auswählen, ohne die Daten zu entschlüsseln. Die App würde eine Verbindung zur Datenbank herstellen, und das Spaltenverschlüsselungseinstellungsschlüsselwort wäre auf „deaktiviert“ festgelegt. Dann würde die Anwendung diese Option zum Masseneinfügen der Daten verwenden, die noch verschlüsselt wären. Weitere Informationen hierzu finden Sie unter Always Encrypted.

Gehen Sie beim Angeben von AllowEncryptedValueModifications vorsichtig vor, da dies zu einer Beschädigung der Datenbank führen kann, da der Treiber nicht überprüft, ob die Daten tatsächlich verschlüsselt sind oder ob sie ordnungsgemäß mit demselben Verschlüsselungstyp, Algorithmus und Schlüssel wie die Zielspalte verschlüsselt sind.

CheckConstraints 2

Überprüft Bedingungen während der Einfügung von Daten. Standardmäßig werden Einschränkungen nicht überprüft.

Default 0

Die Standardwerte für alle Optionen verwenden.

FireTriggers 16

Wenn der Wert angegeben wird, wird der Server veranlasst, die Einfügetrigger für die in die Datenbank eingefügten Zeilen auszulösen.

KeepIdentity 1

Die Identitätswerte der Quelltabelle werden beibehalten. Falls nicht angegeben, werden die Identitätswerte vom Ziel zugewiesen.

KeepNulls 8

NULL-Werte in der Zieltabelle werden beibehalten, unabhängig von der Einstellung für Standardwerte. Falls nicht angegeben, werden NULL-Werte ggf. durch Standardwerte ersetzt.

TableLock 4

Für die Dauer des Massenimportvorgangs wird eine Sperre für Massenaktualisierung aktiviert. Falls nicht angegeben, werden Zeilensperren verwendet.

UseInternalTransaction 32

Wenn angegeben, wird jeder Batch des Massenkopiervorgangs innerhalb einer Transaktion verarbeitet. Wenn Sie diese Option und auch ein SqlTransaction-Objekt für den Konstruktor angeben, tritt ein ArgumentException auf.

Beispiele

Die folgende Konsolenanwendung veranschaulicht, wie Sie eine Massenladung ausführen, die den Wert in der Identitätsspalte der Quelltabelle in die entsprechende Spalte in der Zieltabelle kopiert, anstatt einen neuen Wert für die Identitätsspalte jeder Zeile zu generieren.

Um zu sehen, wie die Option die Funktionsweise des Massenladens ändert, führen Sie das Beispiel mit dem dbo aus. BulkCopyDemoMatchingColumns-Tabelle leer. Alle Zeilen werden von der Quelle geladen. Führen Sie als Nächstes das Beispiel erneut aus, ohne die Tabelle zu leeren. Es wird eine Ausnahme ausgelöst, und der Code schreibt eine Nachricht in das Konsolenfenster, in der Sie darüber informiert werden, dass aufgrund von Primärschlüsselverletzungen keine Zeilen hinzugefügt wurden.

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 derselben SQL Server instance befinden, ist es einfacher und schneller, eine Transact-SQL-Anweisung INSERT … SELECT zum Kopieren der Daten zu verwenden.

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

            // Create the SqlBulkCopy object using a connection string
            // and the KeepIdentity option.
            // 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, SqlBulkCopyOptions.KeepIdentity))
            {
                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;";
    }
}
Imports System.Data.SqlClient

Module Module1
    Sub Main()
        Dim connectionString As String = GetConnectionString()

        ' Open a connection to the AdventureWorks database.
        Using sourceConnection As SqlConnection = _
           New SqlConnection(connectionString)
            sourceConnection.Open()

            ' Perform an initial count on the destination table.
            Dim commandRowCount As New SqlCommand( _
            "SELECT COUNT(*) FROM dbo.BulkCopyDemoMatchingColumns;", _
                sourceConnection)
            Dim countStart As Long = _
               System.Convert.ToInt32(commandRowCount.ExecuteScalar())
            Console.WriteLine("Starting row count = {0}", countStart)

            ' Get data from the source table as a SqlDataReader.
            Dim commandSourceData As SqlCommand = New SqlCommand( _
               "SELECT ProductID, Name, ProductNumber " & _
               "FROM Production.Product;", sourceConnection)
            Dim reader As SqlDataReader = commandSourceData.ExecuteReader

            ' Create the SqlBulkCopy object using a connection string 
            ' and the KeepIdentity option. 
            ' In the real world you would not use SqlBulkCopy to move
            ' data from one table to the other in the same database.
            Using bulkCopy As SqlBulkCopy = _
              New SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)
                bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns"

                Try
                    ' Write from the source to the destination.
                    bulkCopy.WriteToServer(reader)

                Catch ex As Exception
                    Console.WriteLine(ex.Message)

                    Finally
                        ' Close the SqlDataReader. The SqlBulkCopy
                        ' object is automatically closed at the end
                        ' of the Using block.
                        reader.Close()
                End Try
            End Using

            ' Perform a final count on the destination table
            ' to see how many rows were added.
            Dim countEnd As Long = _
                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()
        End Using
    End Sub

    Private Function GetConnectionString() As String
        ' 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;"
    End Function
End Module

Hinweise

Sie können die SqlBulkCopyOptions Enumeration verwenden, wenn Sie eine SqlBulkCopy instance erstellen, um das Verhalten der WriteToServer Methoden für diese instance zu ändern.

Gilt für:

Weitere Informationen