Bewerkingen voor bulksgewijs kopiëren
De eenvoudigste manier om een sql Server-bulkkopiebewerking uit te voeren, is door één bewerking uit te voeren op een database. Standaard wordt een bulksgewijze kopieerbewerking uitgevoerd als een geïsoleerde bewerking: de kopieerbewerking vindt plaats op een niet-transacted manier, zonder de mogelijkheid om deze terug te draaien.
Notitie
Als u de bulkkopie geheel of gedeeltelijk wilt terugdraaien wanneer er een fout optreedt, kunt u een SqlBulkCopybeheerde transactie gebruiken of de bulkkopiebewerking uitvoeren binnen een bestaande transactie. SqlBulkCopy werkt ook als System.Transactions de verbinding wordt opgenomen (impliciet of expliciet) in een System.Transactions-transactie .
Zie Transactie- en bulkkopiebewerkingen voor meer informatie.
De algemene stappen voor het uitvoeren van een bulksgewijs kopiëren zijn als volgt:
Maak verbinding met de bronserver en haal de gegevens op die moeten worden gekopieerd. Gegevens kunnen ook afkomstig zijn van andere bronnen, als deze kunnen worden opgehaald uit een IDataReader of DataTable object.
Maak verbinding met de doelserver (tenzij u wilt dat SqlBulkCopy een verbinding voor u tot stand brengt).
Maak een SqlBulkCopy object en stel de benodigde eigenschappen in.
Stel de eigenschap DestinationTableName in om de doeltabel voor de bulksgewijze invoegbewerking aan te geven.
Roep een van de WriteToServer-methoden aan.
Werk desgewenst eigenschappen bij en roep WriteToServer indien nodig opnieuw aan.
Roep Closede bulkkopiebewerkingen aan of verpakt deze binnen een
Using
instructie.
Let op
Het is raadzaam dat de gegevenstypen van de bron- en doelkolom overeenkomen. Als de gegevenstypen niet overeenkomen, probeert SqlBulkCopy elke bronwaarde te converteren naar het doelgegevenstype, met behulp van de regels die worden gebruikt door Value. Conversies kunnen van invloed zijn op de prestaties en kunnen ook leiden tot onverwachte fouten. Een gegevenstype kan bijvoorbeeld Double
meestal worden geconverteerd naar een Decimal
gegevenstype, maar niet altijd.
Opmerking
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.
Belangrijk
Dit voorbeeld wordt alleen uitgevoerd als u de werktabellen hebt gemaakt, zoals beschreven in voorbeeldinstallatie voor bulksgewijs kopiëren. 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-instructie INSERT … SELECT
te gebruiken om de gegevens te kopiëren.
static void Main()
{
var connectionString = GetConnectionString();
// Open a sourceConnection to the AdventureWorks database.
using (SqlConnection sourceConnection =
new(connectionString))
{
sourceConnection.Open();
// Perform an initial count on the destination table.
SqlCommand commandRowCount = new(
"SELECT COUNT(*) FROM " +
"dbo.BulkCopyDemoMatchingColumns;",
sourceConnection);
long countStart = Convert.ToInt32(
commandRowCount.ExecuteScalar());
Console.WriteLine("Starting row count = {0}", countStart);
// Get data from the source table as a SqlDataReader.
SqlCommand commandSourceData = new(
"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(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(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 = 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();
}
}
}
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
Throw New NotImplementedException()
End Function
End Module
Een bulksgewijs kopiëren-bewerking uitvoeren met Transact-SQL en de opdrachtklasse
In het volgende voorbeeld ziet u hoe u de ExecuteNonQuery methode gebruikt om de INSTRUCTIE BULK INSERT uit te voeren.
Notitie
Het bestandspad voor de gegevensbron is relatief ten opzichte van de server. Het serverproces moet toegang hebben tot dat pad om de bulkkopiebewerking te kunnen voltooien.
Using connection As SqlConnection = New SqlConnection(connectionString)
Dim queryString As String = _
"BULK INSERT Northwind.dbo.[Order Details] FROM " & _
"'f:\mydata\data.tbl' WITH (FORMATFILE='f:\mydata\data.fmt' )"
connection.Open()
SqlCommand command = New SqlCommand(queryString, connection);
command.ExecuteNonQuery()
End Using
using (SqlConnection connection = New SqlConnection(connectionString))
{
string queryString = "BULK INSERT Northwind.dbo.[Order Details] " +
"FROM 'f:\mydata\data.tbl' " +
"WITH ( FORMATFILE='f:\mydata\data.fmt' )";
connection.Open();
SqlCommand command = new SqlCommand(queryString, connection);
command.ExecuteNonQuery();
}