SqlBulkCopyOptions Enum
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Bitvis flagga som anger ett eller flera alternativ att använda med en instans av SqlBulkCopy.
Den här uppräkningen stöder en bitvis kombination av dess medlemsvärden.
public enum class SqlBulkCopyOptions
[System.Flags]
public enum SqlBulkCopyOptions
[<System.Flags>]
type SqlBulkCopyOptions =
Public Enum SqlBulkCopyOptions
- Arv
- Attribut
Fält
| Name | Värde | Description |
|---|---|---|
| Default | 0 | Använd standardvärdena för alla alternativ. |
| KeepIdentity | 1 | Bevara källidentitetsvärden. När det inte anges tilldelas identitetsvärden av målet. |
| CheckConstraints | 2 | Kontrollera begränsningar när data infogas. Som standard kontrolleras inte begränsningar. |
| TableLock | 4 | Hämta ett massuppdateringslås under hela masskopieringsåtgärden. När det inte anges används radlås. |
| KeepNulls | 8 | Bevara null-värden i måltabellen oavsett inställningarna för standardvärden. När de inte anges ersätts null-värden med standardvärden där så är tillämpligt. |
| FireTriggers | 16 | När detta anges utlöser servern infogningsutlösarna för raderna som infogas i databasen. |
| UseInternalTransaction | 32 | När det anges sker varje batch av masskopieringsåtgärden i en transaktion. Om du anger det här alternativet och även anger ett SqlTransaction objekt för konstruktorn, inträffar en ArgumentException . |
| AllowEncryptedValueModifications | 64 | När det anges möjliggör AllowEncryptedValueModifications masskopiering av krypterade data mellan tabeller eller databaser, utan att dekryptera data. Vanligtvis skulle ett program välja data från krypterade kolumner från en tabell utan att dekryptera data (appen skulle ansluta till databasen med kolumnkrypteringsinställningen nyckelord inställd på inaktiverad) och skulle sedan använda det här alternativet för att massinfoga data, som fortfarande är krypterade. Mer information finns i Always Encrypted. Var försiktig när du anger AllowEncryptedValueModifications eftersom detta kan leda till att databasen skadas eftersom drivrutinen inte kontrollerar om data verkligen är krypterade eller om de är korrekt krypterade med samma krypteringstyp, algoritm och nyckel som målkolumnen. |
Exempel
Följande konsolprogram visar hur du utför en massinläsning som kopierar värdet i källtabellens identitetskolumn till motsvarande kolumn i måltabellen, i stället för att generera ett nytt värde för varje rads identitetskolumn.
Om du vill se hur alternativet ändrar hur massinläsningen fungerar kör du exemplet med dbo. BulkCopyDemoMatchingColumns-tabellen är tom. Alla rader läses in från källan. Kör sedan exemplet igen utan att tömma tabellen. Ett undantag utlöses och koden skriver ett meddelande till konsolfönstret som meddelar dig att rader inte har lagts till på grund av överträdelser av primärnyckeln.
Important
Det här exemplet körs inte om du inte har skapat arbetstabellerna enligt beskrivningen i Inställning för masskopieringsexempel. Den här koden tillhandahålls för att demonstrera syntaxen för att endast använda SqlBulkCopy . Om käll- och måltabellerna finns i samma SQL Server instans är det enklare och snabbare att använda en Transact-SQL INSERT … SELECT-instruktion för att kopiera data.
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
Kommentarer
Du kan använda SqlBulkCopyOptions uppräkningen när du skapar en SqlBulkCopy instans för att ändra hur metoderna för den instansen WriteToServer beter sig.