SqlBulkCopyOptions Enumeration
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Bitweise Kennzeichnung, die eine oder mehrere Optionen angibt, die mit einer Instanz von SqlBulkCopyverwendet 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
| Name | Wert | Beschreibung |
|---|---|---|
| Default | 0 | Verwenden Sie die Standardwerte für alle Optionen. |
| KeepIdentity | 1 | Die Identitätswerte der Quelltabelle werden beibehalten. Wenn nicht angegeben, werden identitätswerte vom Ziel zugewiesen. |
| CheckConstraints | 2 | Überprüft Bedingungen während der Einfügung von Daten. Standardmäßig werden Einschränkungen nicht überprüft. |
| TableLock | 4 | Für die Dauer des Massenimportvorgangs wird eine Sperre für Massenaktualisierung aktiviert. Wenn nicht angegeben, werden Zeilensperren verwendet. |
| KeepNulls | 8 | NULL-Werte in der Zieltabelle werden beibehalten, unabhängig von der Einstellung für Standardwerte. Wenn nicht angegeben, werden NULL-Werte ggf. durch Standardwerte ersetzt. |
| FireTriggers | 16 | Wenn angegeben, löst der Server die Einfügetrigger für die Zeilen aus, die in die Datenbank eingefügt werden. |
| UseInternalTransaction | 32 | Wenn angegeben, erfolgt jeder Batch des Massenkopievorgangs innerhalb einer Transaktion. Wenn Sie diese Option angeben und dem Konstruktor auch ein SqlTransaction Objekt bereitstellen, tritt ein ArgumentException . |
| AllowEncryptedValueModifications | 64 | Bei Angabe ermöglicht AllowEncryptedValueModifications das Massenkopien 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. Verwenden Sie Vorsicht, wenn Sie AllowEncryptedValueModifications angeben, 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 ist. |
| CacheMetadata | 128 | Wenn angegeben, speichert CacheMetadata Zieltabellenmetadaten nach dem ersten Massenkopievorgang zwischen, sodass nachfolgende Vorgänge derselben Tabelle die Metadatenermittlungsabfrage überspringen können. Dies kann die Leistung verbessern, wenn mehrere Massenkopievorgänge in derselben Zieltabelle ausgeführt werden. Warnung: Verwenden Sie diese Option nur, wenn Sie sicher sind, dass sich das Zieltabellenschema nicht zwischen Massenkopievorgängen ändert. Wenn sich das Tabellenschema ändert (Spalten, die hinzugefügt, entfernt oder geändert wurden), kann die Verwendung zwischengespeicherter Metadaten zu Datenbeschädigung, fehlgeschlagenen Vorgängen oder unerwartetem Verhalten führen. Rufen Sie auf ClearCachedMetadata() , um den Cache zu löschen, wenn sich das Schema ändert. Der Cache wird automatisch ungültig, wenn DestinationTableName er in eine andere Tabelle geändert wird. Das Ändern ColumnMappings zwischen Vorgängen erfordert keine Cache-Ungültigheit, da die zwischengespeicherten Metadaten nur das Zieltabellenschema und nicht die Quell-zu-Ziel-Spaltenzuordnung beschreiben. Der Cache wird nicht automatisch ungültig, wenn sich der Verbindungskontext ändert. Wenn sich die zugrunde liegende SqlConnection Datenbank (z. B. über ChangeDatabase(String)) ändert oder aufgrund eines Failovers erneut eine Verbindung mit einem anderen Server herstellt, sollten Aufrufer aufrufen ClearCachedMetadata() , um sicherzustellen, dass die Metadaten aktualisiert werden. |
Beispiele
Die folgende Konsolenanwendung veranschaulicht, wie Sie eine Massenlast durchfü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 Massenladevorgangs ändert, führen Sie das Beispiel mit dem dbo aus. BulkCopyDemoMatchingColumns-Tabelle leer. Alle Zeilen werden aus der Quelle geladen. Führen Sie anschließend das Beispiel erneut aus, ohne die Tabelle zu leeren. Eine Ausnahme wird ausgelöst, und der Code schreibt eine Nachricht in das Konsolenfenster, in der Sie darüber informiert werden, dass Zeilen aufgrund von Primärschlüsselverletzungen nicht hinzugefügt wurden.
Important
Dieses Beispiel wird nur ausgeführt, wenn Sie die Arbeitstabellen zuvor wie unter Beispiel für die Einrichtung des Massenkopierens 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-Instanz befinden, ist es einfacher und schneller, eine Transact-SQL-Anweisung INSERT … SELECT zum Kopieren der Daten zu verwenden.
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>
Hinweise
Sie können die SqlBulkCopyOptions Enumeration verwenden, wenn Sie eine SqlBulkCopy Instanz erstellen, um das Verhalten der WriteToServer(DbDataReader) Methoden für diese Instanz zu ändern.