SqlBulkCopy.WriteToServer Método
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
WriteToServer(DbDataReader) |
Copia todas as linhas da matriz DbDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy. |
WriteToServer(DataRow[]) |
Copia todas as linhas da matriz DataRow fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy. |
WriteToServer(DataTable) |
Copia todas as linhas da DataTable fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy. |
WriteToServer(IDataReader) |
Copia todas as linhas da IDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy. |
WriteToServer(DataTable, DataRowState) |
Copia apenas linhas que correspondem ao estado de linha fornecido no DataTable fornecido para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy. |
Copia todas as linhas da matriz DbDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.
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)
Parâmetros
- reader
- DbDataReader
Um DbDataReader cujas linhas serão copiadas para a tabela de destino.
Exceções
Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.
Aplica-se a
Copia todas as linhas da matriz DataRow fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.
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())
Parâmetros
Exceções
Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.
Exemplos
O aplicativo de console a seguir demonstra como carregar dados em massa de uma DataRow matriz. A tabela de destino é uma tabela no banco de dados AdventureWorks .
Neste exemplo, um DataTable é criado em tempo de execução. Uma única linha é selecionada no DataTable para copiar para a tabela de destino.
Importante
Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT
para copiar os dados.
Comentários
Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.
A ColumnMappings coleção mapeia das DataRow colunas para a tabela de banco de dados de destino.
Aplica-se a
Copia todas as linhas da DataTable fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.
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)
Parâmetros
Exceções
Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.
Exemplos
O aplicativo console a seguir demonstra como carregar dados em massa de um DataTable. A tabela de destino é uma tabela no banco de dados AdventureWorks .
Neste exemplo, um DataTable é criado em tempo de execução e é a origem da SqlBulkCopy
operação.
Importante
Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa.
Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT
para copiar os dados.
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;";
}
}
Comentários
Todas as linhas no DataTable são copiadas para a tabela de destino, exceto aquelas que foram excluídas.
Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.
A ColumnMappings coleção mapeia das DataTable colunas para a tabela de banco de dados de destino.
Confira também
Aplica-se a
Copia todas as linhas da IDataReader fornecida para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.
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)
Parâmetros
- reader
- IDataReader
Um IDataReader cujas linhas serão copiadas para a tabela de destino.
Exceções
Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.
Exemplos
O aplicativo de console a seguir demonstra como carregar dados em massa de um SqlDataReader. A tabela de destino é uma tabela no banco de dados AdventureWorks .
Importante
Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT
para copiar os dados.
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;";
}
}
Comentários
A operação de cópia começa na próxima linha disponível no leitor. Na maioria das vezes, o leitor acabou de ser retornado por ExecuteReader() ou uma chamada semelhante, portanto, a próxima linha disponível é a primeira linha. Para processar vários resultados, chame NextResult() no leitor de dados e chame WriteToServer novamente.
Observe que usar WriteToServer modifica o estado do leitor. O método chamará Read() até que retorne false, a operação seja anulada ou ocorra um erro. Isso significa que o leitor de dados estará em um estado diferente, provavelmente no final do conjunto de resultados, quando a WriteToServer operação for concluída.
Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.
A ColumnMappings coleção mapeia das colunas do leitor de dados para a tabela de banco de dados de destino.
Aplica-se a
Copia apenas linhas que correspondem ao estado de linha fornecido no DataTable fornecido para uma tabela de destino especificada pela propriedade DestinationTableName do objeto SqlBulkCopy.
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)
Parâmetros
- rowState
- DataRowState
Um valor da enumeração DataRowState. Somente as linhas que correspondem ao estado de linha são copiadas para o destino.
Exceções
Um SqlBulkCopyColumnOrderHint não especificou um nome de coluna de destino válido.
Exemplos
O aplicativo console a seguir demonstra como carregar em massa apenas as linhas em um DataTable que correspondem a um estado especificado. Nesse caso, somente linhas inalteradas são adicionadas. A tabela de destino é uma tabela no banco de dados AdventureWorks .
Neste exemplo, um DataTable é criado em tempo de execução e três linhas são adicionadas a ele. Antes que o WriteToServer método seja executado, uma das linhas é editada.
O WriteToServer método é chamado com um DataRowState.Unchanged
rowState
argumento , portanto, somente as duas linhas inalteradas são copiadas em massa para o destino.
Importante
Essa amostra não será executada, a menos que você tenha criado as tabelas de trabalho conforme descrito em Configuração de exemplo de cópia em massa. Esse código é fornecido para demonstrar a sintaxe para usar somente SqlBulkCopy. Se as tabelas de origem e destino estiverem na mesma instância SQL Server, será mais fácil e rápido usar uma instrução Transact-SQL INSERT … SELECT
para copiar os dados.
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;";
}
}
Comentários
Somente as DataTable linhas no que estão nos estados indicados no rowState
argumento e não foram excluídas são copiadas para a tabela de destino.
Observação
Se Deleted for especificado, as Unchangedlinhas , Addede Modified também serão copiadas para o servidor. Nenhuma exceção será gerada.
Enquanto a operação de cópia em massa está em andamento, o destino SqlConnection associado está ocupado atendendo-a e nenhuma outra operação pode ser executada na conexão.
A ColumnMappings coleção mapeia das DataTable colunas para a tabela de banco de dados de destino.