SqlBulkCopy.WriteToServer Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Przeciążenia
WriteToServer(DbDataReader) |
Kopiuje wszystkie wiersze z podanej DbDataReader tablicy do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu. |
WriteToServer(DataRow[]) |
Kopiuje wszystkie wiersze z podanej DataRow tablicy do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu. |
WriteToServer(DataTable) |
Kopiuje wszystkie wiersze podane DataTable do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu. |
WriteToServer(IDataReader) |
Kopiuje wszystkie wiersze podane IDataReader do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu. |
WriteToServer(DataTable, DataRowState) |
Kopiuje tylko wiersze zgodne ze stanem podanego wiersza w podanej DataTable tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu. |
WriteToServer(DbDataReader)
Kopiuje wszystkie wiersze z podanej DbDataReader tablicy do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu.
public:
void WriteToServer(System::Data::Common::DbDataReader ^ reader);
public void WriteToServer (System.Data.Common.DbDataReader reader);
member this.WriteToServer : System.Data.Common.DbDataReader -> unit
Public Sub WriteToServer (reader As DbDataReader)
Parametry
- reader
- DbDataReader
A DbDataReader którego wiersze zostaną skopiowane do tabeli docelowej.
Wyjątki
Element SqlBulkCopyColumnOrderHint nie określił prawidłowej nazwy kolumny docelowej.
Dotyczy
WriteToServer(DataRow[])
Kopiuje wszystkie wiersze z podanej DataRow tablicy do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu.
public:
void WriteToServer(cli::array <System::Data::DataRow ^> ^ rows);
public void WriteToServer (System.Data.DataRow[] rows);
member this.WriteToServer : System.Data.DataRow[] -> unit
Public Sub WriteToServer (rows As DataRow())
Parametry
Wyjątki
Element SqlBulkCopyColumnOrderHint nie określił prawidłowej nazwy kolumny docelowej.
Przykłady
W poniższej DataRow aplikacji konsolowej pokazano, jak zbiorczo ładować dane z tablicy. Tabela docelowa jest tabelą w bazie danych AdventureWorks .
W tym przykładzie DataTable tworzony jest element w czasie wykonywania. Jeden wiersz jest wybierany z DataTable elementu , aby skopiować do tabeli docelowej.
Ważne
Ten przykład nie zostanie uruchomiony, chyba że tabele robocze zostały utworzone zgodnie z opisem w temacie Konfiguracja przykładu kopiowania zbiorczego. 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 SQL Server, łatwiej i szybciej używać instrukcji Języka Transact-SQL INSERT … SELECT
do kopiowania danych.
Uwagi
Podczas gdy operacja kopiowania zbiorczego jest w toku, skojarzone miejsce docelowe SqlConnection jest zajęte jego obsługą i nie można wykonać żadnych innych operacji na połączeniu.
Kolekcja ColumnMappings mapuje z DataRow kolumn na docelową tabelę bazy danych.
Dotyczy
WriteToServer(DataTable)
Kopiuje wszystkie wiersze podane DataTable do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu.
public:
void WriteToServer(System::Data::DataTable ^ table);
public void WriteToServer (System.Data.DataTable table);
member this.WriteToServer : System.Data.DataTable -> unit
Public Sub WriteToServer (table As DataTable)
Parametry
Wyjątki
Element SqlBulkCopyColumnOrderHint nie określił prawidłowej nazwy kolumny docelowej.
Przykłady
W poniższej aplikacji konsolowej pokazano, jak zbiorczo ładować dane z elementu DataTable. Tabela docelowa jest tabelą w bazie danych AdventureWorks .
W tym przykładzie DataTable element jest tworzony w czasie wykonywania i jest źródłem SqlBulkCopy
operacji.
Ważne
Ten przykład nie zostanie uruchomiony, chyba że tabele robocze zostały utworzone zgodnie z opisem w temacie Konfiguracja przykładu kopiowania zbiorczego.
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 SQL Server, łatwiej i szybciej używać instrukcji Języka Transact-SQL INSERT … SELECT
do kopiowania danych.
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = GetConnectionString();
// Open a connection to the AdventureWorks database.
using (SqlConnection connection =
new SqlConnection(connectionString))
{
connection.Open();
// Perform an initial count on the destination table.
SqlCommand commandRowCount = new SqlCommand(
"SELECT COUNT(*) FROM " +
"dbo.BulkCopyDemoMatchingColumns;",
connection);
long countStart = System.Convert.ToInt32(
commandRowCount.ExecuteScalar());
Console.WriteLine("Starting row count = {0}", countStart);
// Create a table with some rows.
DataTable newProducts = MakeTable();
// Create the SqlBulkCopy object.
// Note that the column positions in the source DataTable
// match the column positions in the destination table so
// there is no need to map columns.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(newProducts);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
// 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 DataTable MakeTable()
// Create a new DataTable named NewProducts.
{
DataTable newProducts = new DataTable("NewProducts");
// Add three column objects to the table.
DataColumn productID = new DataColumn();
productID.DataType = System.Type.GetType("System.Int32");
productID.ColumnName = "ProductID";
productID.AutoIncrement = true;
newProducts.Columns.Add(productID);
DataColumn productName = new DataColumn();
productName.DataType = System.Type.GetType("System.String");
productName.ColumnName = "Name";
newProducts.Columns.Add(productName);
DataColumn productNumber = new DataColumn();
productNumber.DataType = System.Type.GetType("System.String");
productNumber.ColumnName = "ProductNumber";
newProducts.Columns.Add(productNumber);
// Create an array for DataColumn objects.
DataColumn[] keys = new DataColumn[1];
keys[0] = productID;
newProducts.PrimaryKey = keys;
// Add some new rows to the collection.
DataRow row = newProducts.NewRow();
row["Name"] = "CC-101-WH";
row["ProductNumber"] = "Cyclocomputer - White";
newProducts.Rows.Add(row);
row = newProducts.NewRow();
row["Name"] = "CC-101-BK";
row["ProductNumber"] = "Cyclocomputer - Black";
newProducts.Rows.Add(row);
row = newProducts.NewRow();
row["Name"] = "CC-101-ST";
row["ProductNumber"] = "Cyclocomputer - Stainless";
newProducts.Rows.Add(row);
newProducts.AcceptChanges();
// Return the new DataTable.
return newProducts;
}
private static string GetConnectionString()
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
{
return "Data Source=(local); " +
" Integrated Security=true;" +
"Initial Catalog=AdventureWorks;";
}
}
Uwagi
Wszystkie wiersze w DataTable tabeli docelowej są kopiowane z wyjątkiem tych, które zostały usunięte.
Podczas gdy operacja kopiowania zbiorczego jest w toku, skojarzone miejsce docelowe SqlConnection jest zajęte jego obsługą i nie można wykonać żadnych innych operacji na połączeniu.
Kolekcja ColumnMappings mapuje z DataTable kolumn na docelową tabelę bazy danych.
Zobacz też
Dotyczy
WriteToServer(IDataReader)
Kopiuje wszystkie wiersze podane IDataReader do tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu.
public:
void WriteToServer(System::Data::IDataReader ^ reader);
public void WriteToServer (System.Data.IDataReader reader);
member this.WriteToServer : System.Data.IDataReader -> unit
Public Sub WriteToServer (reader As IDataReader)
Parametry
- reader
- IDataReader
A IDataReader którego wiersze zostaną skopiowane do tabeli docelowej.
Wyjątki
Element SqlBulkCopyColumnOrderHint nie określił prawidłowej nazwy kolumny docelowej.
Przykłady
W poniższej aplikacji konsolowej pokazano, jak zbiorczo ładować dane z obiektu SqlDataReader. Tabela docelowa jest tabelą w bazie danych AdventureWorks .
Ważne
Ten przykład nie zostanie uruchomiony, chyba że tabele robocze zostały utworzone zgodnie z opisem w temacie Konfiguracja przykładu kopiowania zbiorczego. 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 SQL Server, łatwiej i szybciej używać instrukcji Języka Transact-SQL INSERT … SELECT
do kopiowania 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();
// Set up the bulk copy object using a connection string.
// 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))
{
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;";
}
}
Uwagi
Operacja kopiowania rozpoczyna się od następnego dostępnego wiersza w czytniku. W większości przypadków czytnik został właśnie zwrócony przez ExecuteReader() lub podobne wywołanie, więc następny dostępny wiersz jest pierwszym wierszem. Aby przetworzyć wiele wyników, wywołaj NextResult() czytnik danych i wywołaj WriteToServer ponownie.
Należy pamiętać, że użycie WriteToServer modyfikuje stan czytnika. Metoda wywoła metodę Read() , dopóki nie zwróci wartości false, operacja zostanie przerwana lub wystąpi błąd. Oznacza to, że czytnik danych będzie w innym stanie, prawdopodobnie na końcu zestawu wyników, po zakończeniu WriteToServer operacji.
Podczas gdy operacja kopiowania zbiorczego jest w toku, skojarzone miejsce docelowe SqlConnection jest zajęte jego obsługą i nie można wykonać żadnych innych operacji na połączeniu.
Kolekcja ColumnMappings mapuje z kolumn czytnika danych na docelową tabelę bazy danych.
Dotyczy
WriteToServer(DataTable, DataRowState)
Kopiuje tylko wiersze zgodne ze stanem podanego wiersza w podanej DataTable tabeli docelowej określonej przez DestinationTableName właściwość SqlBulkCopy obiektu.
public:
void WriteToServer(System::Data::DataTable ^ table, System::Data::DataRowState rowState);
public void WriteToServer (System.Data.DataTable table, System.Data.DataRowState rowState);
member this.WriteToServer : System.Data.DataTable * System.Data.DataRowState -> unit
Public Sub WriteToServer (table As DataTable, rowState As DataRowState)
Parametry
- rowState
- DataRowState
Wartość z wyliczenia DataRowState . Do miejsca docelowego są kopiowane tylko wiersze pasujące do stanu wiersza.
Wyjątki
Element SqlBulkCopyColumnOrderHint nie określił prawidłowej nazwy kolumny docelowej.
Przykłady
Poniższa aplikacja konsolowa pokazuje, jak zbiorczo ładować tylko wiersze w DataTable określonym stanie. W tym przypadku dodawane są tylko niezmienione wiersze. Tabela docelowa jest tabelą w bazie danych AdventureWorks .
W tym przykładzie DataTable tworzony jest element w czasie wykonywania, a do niego są dodawane trzy wiersze. Przed wykonaniem WriteToServer metody jeden z wierszy jest edytowany.
Metoda WriteToServer jest wywoływana za pomocą argumentu DataRowState.Unchanged
rowState
, więc do miejsca docelowego są kopiowane zbiorczo tylko dwa niezmienione wiersze.
Ważne
Ten przykład nie zostanie uruchomiony, chyba że tabele robocze zostały utworzone zgodnie z opisem w temacie Konfiguracja przykładu kopiowania zbiorczego. 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 SQL Server, łatwiej i szybciej używać instrukcji Języka Transact-SQL INSERT … SELECT
do kopiowania danych.
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = GetConnectionString();
// Open a connection to the AdventureWorks database.
using (SqlConnection connection =
new SqlConnection(connectionString))
{
connection.Open();
// Perform an initial count on the destination table.
SqlCommand commandRowCount = new SqlCommand(
"SELECT COUNT(*) FROM " +
"dbo.BulkCopyDemoMatchingColumns;",
connection);
long countStart = System.Convert.ToInt32(
commandRowCount.ExecuteScalar());
Console.WriteLine("Starting row count = {0}", countStart);
// Create a table with some rows.
DataTable newProducts = MakeTable();
// Make a change to one of the rows in the DataTable.
DataRow row = newProducts.Rows[0];
row.BeginEdit();
row["Name"] = "AAA";
row.EndEdit();
// Create the SqlBulkCopy object.
// Note that the column positions in the source DataTable
// match the column positions in the destination table so
// there is no need to map columns.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
{
// Write unchanged rows from the source to the destination.
bulkCopy.WriteToServer(newProducts, DataRowState.Unchanged);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
// 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 DataTable MakeTable()
// Create a new DataTable named NewProducts.
{
DataTable newProducts = new DataTable("NewProducts");
// Add three column objects to the table.
DataColumn productID = new DataColumn();
productID.DataType = System.Type.GetType("System.Int32");
productID.ColumnName = "ProductID";
productID.AutoIncrement = true;
newProducts.Columns.Add(productID);
DataColumn productName = new DataColumn();
productName.DataType = System.Type.GetType("System.String");
productName.ColumnName = "Name";
newProducts.Columns.Add(productName);
DataColumn productNumber = new DataColumn();
productNumber.DataType = System.Type.GetType("System.String");
productNumber.ColumnName = "ProductNumber";
newProducts.Columns.Add(productNumber);
// Create an array for DataColumn objects.
DataColumn[] keys = new DataColumn[1];
keys[0] = productID;
newProducts.PrimaryKey = keys;
// Add some new rows to the collection.
DataRow row = newProducts.NewRow();
row["Name"] = "CC-101-WH";
row["ProductNumber"] = "Cyclocomputer - White";
newProducts.Rows.Add(row);
row = newProducts.NewRow();
row["Name"] = "CC-101-BK";
row["ProductNumber"] = "Cyclocomputer - Black";
newProducts.Rows.Add(row);
row = newProducts.NewRow();
row["Name"] = "CC-101-ST";
row["ProductNumber"] = "Cyclocomputer - Stainless";
newProducts.Rows.Add(row);
newProducts.AcceptChanges();
// Return the new DataTable.
return newProducts;
}
private static string GetConnectionString()
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
{
return "Data Source=(local); " +
" Integrated Security=true;" +
"Initial Catalog=AdventureWorks;";
}
}
Uwagi
Do tabeli docelowej są kopiowane tylko wiersze w DataTable stanach wskazanych w argumencie rowState
i nie zostały usunięte.
Uwaga
Jeśli Deleted zostanie określony, wszystkie Unchangedwiersze , Addedi Modified zostaną również skopiowane na serwer. Nie zostanie zgłoszony żaden wyjątek.
Podczas gdy operacja kopiowania zbiorczego jest w toku, skojarzone miejsce docelowe SqlConnection jest zajęte jego obsługą i nie można wykonać żadnych innych operacji na połączeniu.
Kolekcja ColumnMappings mapuje z DataTable kolumn na docelową tabelę bazy danych.