【学习笔记】SQL Server 中的批量复制操作 (ADO.NET)

注:本学习笔记资料来源于MSDN帮忙文书档案

SqlBulkCopy 类只好用来向 SQL Server 表中写入数据。 不过,数据源不压制
SQL Server;能够使用其余数据源,只要数据足以加载到 DataTable 实例或接纳IDataReader 实例读取即可。

行使 SqlBulkCopy
类能够推行下列操作:

  1. 单次批量复制操作
  2. 多次批量复制操作
  3. 事情中的批量复制操作

    提供 SqlBulkCopy
    代码示例是为着演示仅使用 SqlBulkCopy 时的语法。
    假诺源表和对象表位于同八个 SQL Server 实例中,则利用 Transact-SQL
    INSECRUISERT … SELECT 语句复制数据会愈来愈便于、尤其急速。
     

    1. 连天到源服务器上并获得要复制的数码。
      假诺能够从 IDataReader 或 DataTable
      对象检索数据,则这几个多少还可财富于其余源。
    2. 接连到对象服务器(除非你希望
      SqlBulkCopy 为您建立连接)。
    3. 始建2个 SqlBulkCopy
      对象,设置任何要求的脾性。
    4. 安装 DestinationTableName
      属性以提醒执行批量安顿操作的指标表。
    5. 调用3个 WriteToServer
      方法。
    6. 能够选拔革新属性并依照要求再一次调用
      WriteToServer。
    7. 调用
      Close,或将批量复制操作包装在 Using 语句中。

施行批量复制操作的一般步骤如下所示:

警告:

我们提议源列和目的列的数据类型匹配。
假使数据类型不协作,则 SqlBulkCopy 会尝试运用由 Value
布置的平整将每种源值转换为对象数据类型。
转换大概会潜移默化属性,还只怕会招致意外的失实。 例如,半数以上气象下,Double
数据类型能够转移为 Decimal 数据类型,然则有时就无法。

SqlBulkCopy 四种 构造函数

SqlBulkCopy(string )

SqlBulkCopy(String, SqlBulkCopyOptions)

SqlBulkCopy(SqlConnection)

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

 

(1)SqlBulkCopy单次批量复制

图片 1图片 2代码

(1)SqlBulkCopy 单次批量复制操作【示例】

using System.Data.SqlClient;

class Program
{
staticvoid
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();
    }
    }
    }
    privatestaticstring
    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;”;
    }
    }

 

 

(2)T-SQL 单次批量复制操作

图片 3图片 4代码

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();

}

 

 

SqlBulkCopy 支持多次批量赋值操作注意:

使用 SqlBulkCopy 的相同实例执行多次批量复制操作通常比每个操作使用独立的实例更加有效。

如果使用相同的 SqlBulkCopy 对象执行多次批量复制操作,不会限制每个操作中的源信息或目标信息相同还是不同。 但是,必须确保每次写入服务器时正确设置了列关联信息。

可以使用 SqlBulkCopy 类的单个实例执行多次批量复制操作。 如果在两次复制之间更改了操作参数(例如目标表的名称),必须先更新这些参数,然后再进行对任何 WriteToServer 方法的后续调用,如下例中所示。 除非显式更改,否则,所有属性值都将与给定实例的上一次批量复制操作相同。

 

批量复制操作能够看成单身的操作实践,也得以看作多步工作的一部分进行。
后一种办法使你能够在相同业务中推行八个批量复制操作并推行其余数据库操作(例如插入、更新和删除),同时还是可以够交给或回滚整个业务。

暗许意况下,批量复制操作作为单身的操作实施。
批量复制操作以非事务个性局发生,不恐怕使其回滚。如若必要在失误时回滚全体批量复制或它的一某些,能够行使
SqlBulkCopy.aspx)
托管的政工,在存活工作中履行批量复制操作,大概在
System.TransactionsTransaction.aspx)
中注册它。

(3)在代码中执行专有事务的复制操作。         

  

using (SqlBulkCopy bulkCopy =new SqlBulkCopy(

connectionString, SqlBulkCopyOptions.KeepIdentity |

SqlBulkCopyOptions.UseInternalTransaction))

 

     (4)使用现有事务

  

代码

using (SqlTransaction transaction = destinationConnection.BeginTransaction())
using (SqlBulkCopy bulkCopy =new SqlBulkCopy(
destinationConnection, SqlBulkCopyOptions.KeepIdentity,
transaction))

 

 

 

 

 

    

相关文章