Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Najprostszym podejściem do wykonywania operacji kopiowania zbiorczego programu SQL Server jest wykonanie pojedynczej operacji względem bazy danych. Domyślnie operacja kopiowania zbiorczego jest wykonywana jako operacja izolowana: operacja kopiowania odbywa się bez użycia transakcji, bez możliwości jej wycofania.
Uwaga / Notatka
Jeśli musisz wycofać całą lub część kopii zbiorczej po wystąpieniu błędu, możesz użyć transakcji zarządzanej SqlBulkCopylub wykonać operację kopiowania zbiorczego w ramach istniejącej transakcji. Narzędzie SqlBulkCopy będzie również działaćSystem.Transactions, jeśli połączenie jest zarejestrowane (niejawnie lub jawnie) w transakcji System.Transactions.
Aby uzyskać więcej informacji, zobacz Transakcje i operacje kopiowania zbiorczego.
Ogólne kroki wykonywania operacji kopiowania zbiorczego są następujące:
Połącz się z serwerem źródłowym i uzyskaj dane do skopiowania. Dane mogą również pochodzić z innych źródeł, jeśli można je pobrać z IDataReader obiektu lub DataTable .
Połącz się z serwerem docelowym (chyba że chcesz, aby narzędzie SqlBulkCopy nawiązało połączenie).
SqlBulkCopy Utwórz obiekt, ustawiając wszelkie niezbędne właściwości.
Ustaw właściwość DestinationTableName , aby wskazać tabelę docelową operacji wstawiania zbiorczego.
Wywołaj jedną z metod WriteToServer .
Opcjonalnie zaktualizuj właściwości i ponownie wywołaj metodę WriteToServer w razie potrzeby.
Wywołaj Close lub opakuj operacje kopiowania zbiorczego za pomocą instrukcji
Using.
Ostrzeżenie
Zalecamy dopasowanie typów danych kolumn źródłowych i docelowych. Jeśli typy danych nie są zgodne, narzędzie SqlBulkCopy próbuje przekonwertować każdą wartość źródłową na docelowy typ danych przy użyciu reguł stosowanych przez Valueprogram . Konwersje mogą wpływać na wydajność, a także powodować nieoczekiwane błędy. Na przykład Double typ danych można przekonwertować na Decimal typ danych przez większość czasu, ale nie zawsze.
Example
Poniższa aplikacja konsolowa pokazuje, jak ładować dane przy użyciu SqlBulkCopy klasy . W tym przykładzie element SqlDataReader jest używany do kopiowania danych z tabeli Production.Product w bazie danych AdventureWorks SQL Server do podobnej tabeli w tej samej bazie danych.
Ważne
Ten przykład nie będzie działać, chyba że utworzysz tabele robocze zgodnie z opisem w sekcji Konfiguracja przykładu kopiowania masowego. Ten kod jest dostarczany w celu zademonstrowania składni tylko przy użyciu narzędzia SqlBulkCopy . Jeśli tabele źródłowe i docelowe znajdują się w tym samym wystąpieniu programu SQL Server, łatwiej i szybciej jest użyć instrukcji Transact-SQL INSERT ... SELECT do skopiowania danych.
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);
// Print the number of rows processed using the
// RowsCopied property.
Console.WriteLine("{0} rows were processed.",
bulkCopy.RowsCopied);
}
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;";
}
}
Wykonywanie operacji kopiowania zbiorczego przy użyciu Transact-SQL i klasy poleceń
Poniższy przykład ilustruje sposób użycia ExecuteNonQuery metody do wykonania instrukcji BULK INSERT.
Uwaga / Notatka
Ścieżka pliku dla źródła danych jest względna względem serwera. Proces serwera musi mieć dostęp do tej ścieżki, aby operacja kopiowania zbiorczego powiodła się.
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();
}