SqlBulkCopy使用记录

MSDN:

Microsoft SQL Server includes a popular command-prompt utility named bcp for moving data from one table to another, whether on a single server or between servers. The SqlBulkCopy class lets you write managed code solutions that provide similar functionality. There are other ways to load data into a SQL Server table (INSERT statements, for example), but SqlBulkCopy offers a significant performance advantage over them.

The SqlBulkCopy class can be used to write data only to SQL Server tables. However, the data source is not limited to SQL Server; any data source can be used, as long as the data can be loaded to a DataTable instance or read with a IDataReader instance.

    大致是说SqlBulkCopy提供了可以在同一服务器下或多个服务器之间进行传递数据的工作,尽管也有其他方法能实现这个功能,但它明显要更高效.

    这个方法仅只能向SqlServer中的表写数据,它能通过DataTable实现,或者IDataReader实现.

    以下实例仅供记录,提供思路作用,并不保证测试通过..

实例1.

   DataTable例子

  
    
public void ExecuteInsert( string destinationTableName, DataTable sourcedt)
{
Open();
using (SqlBulkCopy sbc = new SqlBulkCopy(con))
{
// 服务器上目标表的名称
sbc.DestinationTableName = destinationTableName;
for ( int i = 0 ; i < sourcedt.Columns.Count; i ++ )
{
// 列映射定义数据源中的列和目标表中的列之间的关系
sbc.ColumnMappings.Add(sourcedt.Columns[i].ColumnName, " destinationName " );
}
sbc.WriteToServer(sourcedt);
}
}
实例2 DataReader

  

代码
   
     
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; " ;
}
}

 

 

你可能感兴趣的:(copy)