SqlBulkCopyOptions Wyliczenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Flaga bitowa określająca co najmniej jedną opcję do użycia z wystąpieniem SqlBulkCopy.
To wyliczenie obsługuje bitową kombinację jego wartości składowych.
public enum class SqlBulkCopyOptions
[System.Flags]
public enum SqlBulkCopyOptions
[<System.Flags>]
type SqlBulkCopyOptions =
Public Enum SqlBulkCopyOptions
- Dziedziczenie
-
SqlBulkCopyOptions
- Atrybuty
Pola
| Nazwa | Wartość | Opis |
|---|---|---|
| Default | 0 | Użyj wartości domyślnych dla wszystkich opcji. |
| KeepIdentity | 1 | Zachowaj wartości tożsamości źródłowej. Jeśli nie zostanie określony, wartości tożsamości są przypisywane przez miejsce docelowe. |
| CheckConstraints | 2 | Sprawdź ograniczenia podczas wstawiania danych. Domyślnie ograniczenia nie są sprawdzane. |
| TableLock | 4 | Uzyskaj blokadę aktualizacji zbiorczej dla czasu trwania operacji kopiowania zbiorczego. Jeśli nie zostanie określony, są używane blokady wierszy. |
| KeepNulls | 8 | Zachowaj wartości null w tabeli docelowej niezależnie od ustawień wartości domyślnych. Jeśli nie zostanie określona, wartości null są zastępowane wartościami domyślnymi, jeśli ma to zastosowanie. |
| FireTriggers | 16 | Po określeniu należy spowodować, że serwer uruchomi wyzwalacze wstawiania dla wierszy wstawionych do bazy danych. |
| UseInternalTransaction | 32 | Po określeniu każda partia operacji kopiowania zbiorczego zostanie wykonana w ramach transakcji. Jeśli wskażesz tę opcję, a także podasz SqlTransaction obiekt konstruktorowi, wystąpi.ArgumentException |
| AllowEncryptedValueModifications | 64 | Po określeniu parametru AllowEncryptedValueModifications umożliwia zbiorcze kopiowanie zaszyfrowanych danych między tabelami lub bazami danych bez odszyfrowywania danych. Zazwyczaj aplikacja wybiera dane z zaszyfrowanych kolumn z jednej tabeli bez odszyfrowywania danych (aplikacja łączy się z bazą danych przy użyciu słowa kluczowego szyfrowania kolumny ustawionego na wyłączone), a następnie użyje tej opcji, aby zbiorczo wstawić dane, które są nadal szyfrowane. Należy zachować ostrożność podczas określania parametru AllowEncryptedValueModifications , ponieważ może to prowadzić do uszkodzenia bazy danych, ponieważ sterownik nie sprawdza, czy dane są rzeczywiście zaszyfrowane lub czy są prawidłowo szyfrowane przy użyciu tego samego typu szyfrowania, algorytmu i klucza co kolumna docelowa. |
| CacheMetadata | 128 | Po określeniu parametru CacheMetadata buforuje metadane tabeli docelowej po pierwszej operacji kopiowania zbiorczego, co umożliwia wykonywanie kolejnych operacji w tej samej tabeli w celu pominięcia zapytania odnajdywania metadanych. Może to zwiększyć wydajność podczas wykonywania wielu operacji kopiowania zbiorczego do tej samej tabeli docelowej. Ostrzeżenie: Użyj tej opcji tylko wtedy, gdy masz pewność, że schemat tabeli docelowej nie zmieni się między operacjami kopiowania zbiorczego. Jeśli schemat tabeli ulegnie zmianie (kolumny dodane, usunięte lub zmodyfikowane), użycie buforowanych metadanych może spowodować uszkodzenie danych, nieudane operacje lub nieoczekiwane zachowanie. Wywołaj metodę ClearCachedMetadata() , aby wyczyścić pamięć podręczną, jeśli schemat ulegnie zmianie. Pamięć podręczna jest automatycznie unieważniona, gdy DestinationTableName zostanie zmieniona na inną tabelę. Zmiana ColumnMappings między operacjami nie wymaga unieważnienia pamięci podręcznej, ponieważ buforowane metadane opisują tylko schemat tabeli docelowej, a nie mapowanie kolumn źródłowych na docelową. Pamięć podręczna nie jest automatycznie unieważniona po zmianie kontekstu połączenia. Jeśli bazowa SqlConnection baza danych ulegnie zmianie (na przykład za pośrednictwem ChangeDatabase(String)) lub ponownie nawiąż połączenie z innym serwerem z powodu przełączenia w tryb failover, osoby wywołujące powinny wywołać metodę ClearCachedMetadata() w celu upewnienia się, że metadane są odświeżane. |
Przykłady
Poniższa aplikacja konsolowa pokazuje, jak wykonać zbiorcze ładowanie, które kopiuje wartość w kolumnie tożsamości tabeli źródłowej do odpowiedniej kolumny w tabeli docelowej, zamiast generować nową wartość dla kolumny tożsamości każdego wiersza.
Aby zobaczyć, jak opcja zmienia sposób działania obciążenia zbiorczego, uruchom przykład z bazą danych. Tabela BulkCopyDemoMatchingColumns jest pusta. Wszystkie wiersze są ładowane ze źródła. Następnie ponownie uruchom przykład bez opróżniania tabeli. Zgłaszany jest wyjątek, a kod zapisuje komunikat w oknie konsoli z powiadomieniem, że wiersze nie zostały dodane z powodu naruszeń klucza podstawowego.
Ważna
Ten przykład programu się nie uruchomi, chyba że tabele robocze zostaną utworzone zgodnie z opisem w Konfiguracji Przykładu Kopiowania Zbiorczego. Ten kod jest dostarczany w celu zademonstrowania składni tylko przy użyciu narzędzia SqlBulkCopy . Jeśli tabele źródłowe i docelowe znajdują się w tym samym wystąpieniu programu SQL Server, łatwiej i szybciej używać instrukcji Transact-SQL INSERT … SELECT do kopiowania danych.
namespace SqlBulkCopy_KeepIdentity;
using System;
using System.Data;
// <Snippet1>
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();
// 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;";
}
}
// </Snippet1>
Uwagi
Wyliczenie można użyć SqlBulkCopyOptions podczas konstruowania SqlBulkCopy wystąpienia, aby zmienić sposób WriteToServer(DbDataReader) zachowania metod dla tego wystąpienia.