SqlBulkCopy Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee kunt u een SQL Server tabel efficiënt bulksgewijs laden met gegevens uit een andere bron.
public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
- Overname
-
SqlBulkCopy
- Implementeringen
Voorbeelden
In de volgende consoletoepassing ziet u hoe u gegevens laadt met behulp van de SqlBulkCopy klasse. In dit voorbeeld wordt er een SqlDataReader gebruikt voor het kopiëren van gegevens uit de tabel Production.Product in de SQL Server AdventureWorks-database naar een vergelijkbare tabel in dezelfde database.
Important
Dit voorbeeld wordt niet uitgevoerd tenzij u de werktabellen hebt gemaakt, zoals beschreven in Bulk Copy Voorbeeldconfiguratie. Deze code wordt verstrekt om alleen de syntaxis voor het gebruik van SqlBulkCopy te demonstreren. Als de bron- en doeltabellen zich in hetzelfde SQL Server exemplaar bevinden, is het eenvoudiger en sneller om een Transact-SQL INSERT ... SELECT-instructie te gebruiken om de gegevens te kopiëren.
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();
// 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;";
}
}
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 New SqlCommand( _
"SELECT ProductID, Name, ProductNumber " & _
"FROM Production.Product;", sourceConnection)
Dim reader As SqlDataReader = 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 destinationConnection As SqlConnection = _
New SqlConnection(connectionString)
destinationConnection.Open()
' Set up the bulk copy object.
' 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 bulkCopy As SqlBulkCopy = _
New SqlBulkCopy(destinationConnection)
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 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
Opmerkingen
Microsoft SQL Server bevat een populair opdrachtpromptprogramma met de naam bcp voor het verplaatsen van gegevens van de ene tabel naar de andere, op één server of tussen servers. Met de SqlBulkCopy klasse kunt u beheerde codeoplossingen schrijven die vergelijkbare functionaliteit bieden. Er zijn andere manieren om gegevens te laden in een SQL Server-tabel (insert-instructies, bijvoorbeeld), maar SqlBulkCopy biedt een aanzienlijk prestatievoordeel ten opzichte van deze tabellen.
De SqlBulkCopy klasse kan worden gebruikt om alleen gegevens naar SQL Server-tabellen te schrijven. De gegevensbron is echter niet beperkt tot SQL Server; elke gegevensbron kan worden gebruikt, zolang de gegevens kunnen worden geladen in een DataTable-exemplaar of worden gelezen met een IDataReader-exemplaar.
SqlBulkCopy mislukt bij het bulksgewijs laden van een DataTable kolom van het type SqlDateTime in een SQL Server kolom waarvan het type een van de datum-/tijdtypen is die zijn toegevoegd in SQL Server 2008.
Constructors
| Name | Description |
|---|---|
| SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction) |
Initialiseert een nieuw exemplaar van de SqlBulkCopy klasse met behulp van de opgegeven bestaande open instantie van SqlConnection. Het SqlBulkCopy exemplaar gedraagt zich volgens de opties die zijn opgegeven in de |
| SqlBulkCopy(SqlConnection) |
Initialiseert een nieuw exemplaar van de SqlBulkCopy klasse met behulp van de opgegeven open instantie van SqlConnection. |
| SqlBulkCopy(String, SqlBulkCopyOptions) |
Initialiseert en opent een nieuw exemplaar van SqlConnection op basis van de opgegeven |
| SqlBulkCopy(String) |
Initialiseert en opent een nieuw exemplaar van SqlConnection op basis van de opgegeven |
Eigenschappen
| Name | Description |
|---|---|
| BatchSize |
Het aantal rijen in elke batch. Aan het einde van elke batch worden de rijen in de batch verzonden naar de server. |
| BulkCopyTimeout |
Aantal seconden dat de bewerking moet worden voltooid voordat er een time-out optreedt. |
| ColumnMappings |
Retourneert een verzameling SqlBulkCopyColumnMapping items. Kolomtoewijzingen definiëren de relaties tussen kolommen in de gegevensbron en kolommen in het doel. |
| DestinationTableName |
Naam van de doeltabel op de server. |
| EnableStreaming |
Hiermee schakelt u een SqlBulkCopy object in of uit om gegevens van een IDataReader object te streamen. |
| NotifyAfter |
Definieert het aantal rijen dat moet worden verwerkt voordat een meldingsgebeurtenis wordt gegenereerd. |
Methoden
| Name | Description |
|---|---|
| Close() |
Hiermee sluit u de SqlBulkCopy instantie. |
| Equals(Object) |
Bepaalt of het opgegeven object gelijk is aan het huidige object. (Overgenomen van Object) |
| GetHashCode() |
Fungeert als de standaardhashfunctie. (Overgenomen van Object) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
| WriteToServer(DataRow[]) |
Kopieert alle rijen van de opgegeven DataRow matrix naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServer(DataTable, DataRowState) |
Kopieert alleen rijen die overeenkomen met de opgegeven rijstatus in de opgegeven DataTable aan een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServer(DataTable) |
Kopieert alle rijen in de opgegeven DataTable naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServer(DbDataReader) |
Kopieert alle rijen van de opgegeven DbDataReader matrix naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServer(IDataReader) |
Kopieert alle rijen in de opgegeven IDataReader naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServerAsync(DataRow[], CancellationToken) |
De asynchrone versie van WriteToServer(DataRow[]), waarmee alle rijen van de opgegeven DataRow matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject. |
| WriteToServerAsync(DataRow[]) |
De asynchrone versie van WriteToServer(DataRow[]), waarmee alle rijen van de opgegeven DataRow matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServerAsync(DataTable, CancellationToken) |
De asynchrone versie van WriteToServer(DataTable), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd DataTable die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject. |
| WriteToServerAsync(DataTable, DataRowState, CancellationToken) |
De asynchrone versie van WriteToServer(DataTable, DataRowState), waarmee alleen rijen worden gekopieerd die overeenkomen met de opgegeven rijstatus in de opgegeven DataTable doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject. |
| WriteToServerAsync(DataTable, DataRowState) |
De asynchrone versie van WriteToServer(DataTable, DataRowState), waarmee alleen rijen worden gekopieerd die overeenkomen met de opgegeven rijstatus in de opgegeven DataTable doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServerAsync(DataTable) |
De asynchrone versie van WriteToServer(DataTable), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd DataTable die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServerAsync(DbDataReader, CancellationToken) |
De asynchrone versie van WriteToServer(DbDataReader), waarmee alle rijen van de opgegeven DbDataReader matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServerAsync(DbDataReader) |
De asynchrone versie van WriteToServer(DbDataReader), waarmee alle rijen van de opgegeven DbDataReader matrix worden gekopieerd naar een doeltabel die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
| WriteToServerAsync(IDataReader, CancellationToken) |
De asynchrone versie van WriteToServer(IDataReader), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd IDataReader die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. Het annuleringstoken kan worden gebruikt om aan te vragen dat de bewerking wordt afgelaten voordat de time-out van de opdracht is verstreken. Uitzonderingen worden gerapporteerd via het geretourneerde taakobject. |
| WriteToServerAsync(IDataReader) |
De asynchrone versie van WriteToServer(IDataReader), waarmee alle rijen in de opgegeven naar een doeltabel worden gekopieerd IDataReader die is opgegeven door de DestinationTableName eigenschap van het SqlBulkCopy object. |
gebeurtenis
| Name | Description |
|---|---|
| SqlRowsCopied |
Vindt elke keer plaats dat het aantal rijen dat door de NotifyAfter eigenschap is opgegeven, is verwerkt. |
Expliciete interface-implementaties
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Alle resources die door het huidige exemplaar van de SqlBulkCopy klasse worden gebruikt, worden vrijgegeven. |