SqlBulkCopy Klasse
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.
Hiermit können Sie eine SQL Server Tabelle effizient mit Daten aus einer anderen Quelle laden.
public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
- Vererbung
-
SqlBulkCopy
- Implementiert
Beispiele
Die folgende Konsolenanwendung zeigt das Laden von Daten mithilfe der Klasse SqlBulkCopy. In diesem Beispiel werden in der SQL Server-Datenbank SqlDataReader unter Verwendung von Daten aus der Tabelle Production.Product in eine ähnliche Tabelle derselben Datenbank kopiert.
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.
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();
// Open the destination connection. In the real world you would
// not use SqlBulkCopy to move data from one table to the other
// in the same database. This is for demonstration purposes only.
using (SqlConnection destinationConnection =
new SqlConnection(connectionString))
{
destinationConnection.Open();
// Set up the bulk copy object.
// Note that the column positions in the source
// data reader match the column positions in
// the destination table so there is no need to
// map columns.
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destinationConnection))
{
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;";
}
}
Hinweise
Microsoft SQL Server enthält ein beliebtes Befehlszeilenprogramm mit dem Namen bcp zum Verschieben von Daten aus einer Tabelle in eine andere, ob auf einem einzelnen Server oder zwischen Servern. Mit der SqlBulkCopy Klasse können Sie Lösungen mit verwaltetem Code schreiben, die ähnliche Funktionen bieten. Es gibt eine Reihe weiterer Verfahren, Daten in eine SQL Server-Tabelle zu laden (beispielsweise INSERT-Anweisungen), aber SqlBulkCopy bietet im Vergleich einen erheblichen Leistungsvorteil. Die SqlBulkCopy-Klasse kann nur zum Schreiben von Daten in SQL Server-Tabellen verwendet werden. Die Datenquelle ist jedoch nicht auf SQL Server beschränkt. Jede Datenquelle kann verwendet werden, solange die Daten in eine DataTable-Instanz geladen oder mit einer IDataReaderInstanz gelesen werden können. SqlBulkCopy schlägt fehl, wenn eine DataTable Spalte vom Typ SqlDateTime in eine SQL Server Spalte geladen wird, deren Typ einer der Datums-/Uhrzeittypen ist, die in SQL Server 2008 hinzugefügt wurden.
Konstruktoren
| Name | Beschreibung |
|---|---|
| SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction) |
Initialisiert eine neue Instanz der SqlBulkCopy Klasse mithilfe der bereitgestellten geöffneten Instanz von SqlConnection. Die SqlBulkCopy Instanz verhält sich entsprechend den optionen, die |
| SqlBulkCopy(SqlConnection) |
Hiermit wird eine neue Instanz der SqlBulkCopy-Klasse mithilfe der angegebenen geöffneten Instanz von SqlConnection initialisiert. |
| SqlBulkCopy(String, SqlBulkCopyOptions) |
Hiermit wird eine neue Instanz von SqlConnection auf Grundlage der angegebenen |
| SqlBulkCopy(String) |
Hiermit wird eine neue Instanz von SqlConnection auf Grundlage der angegebenen |
Eigenschaften
| Name | Beschreibung |
|---|---|
| BatchSize |
Anzahl der Zeilen in jedem Batch. Am Ende jedes Batches werden die im Batch enthaltenen Zeilen an den Server gesendet. |
| BulkCopyTimeout |
Die Anzahl der Sekunden, für die der Vorgang abgeschlossen werden soll, bevor ein Zeitüberschreitung auftritt. |
| ColumnMappings |
Gibt eine Auflistung von SqlBulkCopyColumnMapping Elementen zurück. Spaltenzuordnungen definieren die Beziehungen zwischen Spalten in der Datenquelle und Spalten im Ziel. |
| ColumnOrderHints |
Gibt eine Auflistung von SqlBulkCopyColumnOrderHint Elementen zurück. Spaltenreihenfolgehinweise beschreiben die Sortierreihenfolge von Spalten im gruppierten Index der Zieltabelle. |
| DestinationTableName |
Name der Zieltabelle auf dem Server. |
| EnableStreaming |
Aktiviert oder deaktiviert ein SqlBulkCopy Objekt zum Streamen von Daten aus einem IDataReader Objekt |
| NotifyAfter |
Definiert die Anzahl der zu verarbeitenden Zeilen, bevor ein Benachrichtigungsereignis generiert wird. |
| RowsCopied |
Die Anzahl der Zeilen, die im laufenden Massenkopievorgang verarbeitet wurden. |
| RowsCopied64 |
Die Anzahl der Zeilen, die im laufenden Massenkopievorgang verarbeitet wurden. |
Methoden
| Name | Beschreibung |
|---|---|
| ClearCachedMetadata() |
Löscht die Metadaten der zwischengespeicherten Zieltabelle bei Verwendung der CacheMetadata Option. |
| Close() |
Hiermit wird die SqlBulkCopy-Instanz geschlossen. |
| WriteToServer(DataRow[]) |
Kopiert alle Zeilen aus dem angegebenen DataRow Array in eine Zieltabelle, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServer(DataTable, DataRowState) |
Kopiert nur Zeilen, die dem angegebenen Zeilenstatus in der angegebenen DataTable Zieltabelle entsprechen, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServer(DataTable) |
Hiermit werden alle Zeilen in der angegebenen DataTable in eine Zieltabelle kopiert, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts festgelegt wird. |
| WriteToServer(DbDataReader) |
Kopiert alle Zeilen aus dem angegebenen DbDataReader Array in eine Zieltabelle, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServer(IDataReader) |
Hiermit werden alle Zeilen in der angegebenen IDataReader in eine Zieltabelle kopiert, die durch die DestinationTableName-Eigenschaft des SqlBulkCopy-Objekts festgelegt wird. |
| WriteToServerAsync(DataRow[], CancellationToken) |
Die asynchrone Version, von WriteToServer(DataRow[])der alle Zeilen aus dem angegebenen DataRow Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Befehlstimeout verstrichen ist. Ausnahmen werden über das zurückgegebene Task-Objekt gemeldet. |
| WriteToServerAsync(DataRow[]) |
Die asynchrone Version, von WriteToServer(DataRow[])der alle Zeilen aus dem angegebenen DataRow Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServerAsync(DataTable, CancellationToken) |
Die asynchrone Version von WriteToServer(DataTable), die alle Zeilen in der angegebenen DataTable Zieltabelle kopiert, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Befehlstimeout verstrichen ist. Ausnahmen werden über das zurückgegebene Task-Objekt gemeldet. |
| WriteToServerAsync(DataTable, DataRowState, CancellationToken) |
Die asynchrone Version, von WriteToServer(DataTable, DataRowState)der nur Zeilen kopiert werden, die dem angegebenen Zeilenstatus in der angegebenen DataTable Zieltabelle entsprechen, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Befehlstimeout verstrichen ist. Ausnahmen werden über das zurückgegebene Task-Objekt gemeldet. |
| WriteToServerAsync(DataTable, DataRowState) |
Die asynchrone Version, von WriteToServer(DataTable, DataRowState)der nur Zeilen kopiert werden, die dem angegebenen Zeilenstatus in der angegebenen DataTable Zieltabelle entsprechen, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServerAsync(DataTable) |
Die asynchrone Version von WriteToServer(DataTable), die alle Zeilen in der angegebenen DataTable Zieltabelle kopiert, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServerAsync(DbDataReader, CancellationToken) |
Die asynchrone Version, von WriteToServer(DbDataReader)der alle Zeilen aus dem angegebenen DbDataReader Array in eine Zieltabelle kopiert werden, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Befehlstimeout verstrichen ist. Ausnahmen werden über das zurückgegebene Task-Objekt gemeldet. |
| WriteToServerAsync(DbDataReader) |
Die asynchrone Version von WriteToServer(IDataReader), die alle Zeilen in der angegebenen IDataReader Zieltabelle kopiert, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
| WriteToServerAsync(IDataReader, CancellationToken) |
Die asynchrone Version von WriteToServer(IDataReader), die alle Zeilen in der angegebenen IDataReader Zieltabelle kopiert, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. Das Abbruchtoken kann verwendet werden, um anzufordern, dass der Vorgang abgebrochen wird, bevor das Befehlstimeout verstrichen ist. Ausnahmen werden über das zurückgegebene Task-Objekt gemeldet. |
| WriteToServerAsync(IDataReader) |
Die asynchrone Version von WriteToServer(IDataReader), die alle Zeilen in der angegebenen IDataReader Zieltabelle kopiert, die durch die DestinationTableName Eigenschaft des SqlBulkCopy Objekts angegeben wird. |
Ereignisse
| Name | Beschreibung |
|---|---|
| SqlRowsCopied |
Tritt jedes Mal auf, wenn die Anzahl der zeilen, die von der NotifyAfter Eigenschaft angegeben wurden, verarbeitet wurden. |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| IDisposable.Dispose() |
Gibt alle Ressourcen frei, die von der aktuellen Instanz der SqlBulkCopy Klasse verwendet werden. |