Condividi tramite


SqlBulkCopyOptions Enumerazione

Definizione

Flag bit per bit che specifica una o più opzioni da usare con un'istanza di SqlBulkCopy.

Questa enumerazione supporta una combinazione bit per bit dei rispettivi valori dei membri.

public enum class SqlBulkCopyOptions
[System.Flags]
public enum SqlBulkCopyOptions
[<System.Flags>]
type SqlBulkCopyOptions = 
Public Enum SqlBulkCopyOptions
Ereditarietà
SqlBulkCopyOptions
Attributi

Campi

AllowEncryptedValueModifications 64

Se specificato, AllowEncryptedValueModifications consente la copia bulk di dati crittografati tra tabelle o database, senza decrittografare i dati. Solitamente un'applicazione seleziona i dati dalle colonne crittografate di un'unica tabella senza decrittografarli (l'app si connette al database con la parola chiave di impostazione della crittografia delle colonne impostata sullo stato disabilitato) e quindi usa questa opzione per eseguire l'inserimento bulk dei dati che sono ancora crittografati. Per altre informazioni, vedere Always Encrypted.

Prestare attenzione quando si specifica AllowEncryptedValueModifications perché ciò può causare il danneggiamento del database perché il driver non verifica se i dati sono effettivamente crittografati o se sono crittografati correttamente usando lo stesso tipo di crittografia, algoritmo e chiave della colonna di destinazione.

CheckConstraints 2

Controllare i vincoli durante l'inserimento dei dati. Per impostazione predefinita, i vincoli non vengono controllati.

Default 0

Usare i valori predefiniti per tutte le opzioni.

FireTriggers 16

Se specificato, il server genera i trigger di inserimento per le righe da inserire nel database.

KeepIdentity 1

Mantenere i valori Identity di origine. Se omesso, i valori Identity vengono assegnati dalla destinazione.

KeepNulls 8

Mantenere i valori null nella tabella di destinazione indipendentemente dalle impostazioni per i valori predefiniti. Se omessi, i valori null vengono sostituiti dai valori predefiniti quando possibile.

TableLock 4

Ottenere un blocco di aggiornamento bulk per la durata dell'operazione di copia bulk. Se omesso, vengono usati i blocchi righe.

UseInternalTransaction 32

Se specificato, ogni batch dell'operazione di copia bulk viene eseguito all'interno di una transazione. Se si indica questa opzione e si fornisce un oggetto SqlTransaction al costruttore, si avrà un ArgumentException.

Esempio

L'applicazione console seguente illustra come eseguire un caricamento bulk che copia il valore nella colonna Identity della tabella di origine nella colonna corrispondente nella tabella di destinazione, anziché generare un nuovo valore per la colonna Identity di ogni riga.

Per vedere come l'opzione modifica il funzionamento del caricamento bulk, eseguire l'esempio con dbo. Tabella BulkCopyDemoMatchingColumns vuota. Tutte le righe vengono caricate dall'origine. Eseguire quindi di nuovo l'esempio senza svuotare la tabella. Viene generata un'eccezione e il codice scrive un messaggio nella finestra della console che informa che le righe non sono state aggiunte a causa di violazioni della chiave primaria.

Importante

Questo esempio non verrà eseguito a meno che non siano state create le tabelle di lavoro, come descritto in Installazione dell'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 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

Commenti

È possibile usare l'enumerazione quando si costruisce un'istanza SqlBulkCopyOptionsSqlBulkCopy per modificare il comportamento dei WriteToServer metodi per tale istanza.

Si applica a

Vedi anche