Microsoft SQL Server 包含名为 bcp 的常用命令行应用程序,用于快速将大文件批量复制到 SQL Server 数据库的表或视图中。使用 SqlBulkCopy 类可以编写提供类似功能的托管代码解决方案。还可以通过其他方式将数据加载到 SQL Server 表中(例如 INSERT 语句),但是 SqlBulkCopy 提供的性能要明显优于这些方式。
SqlBulkCopy 类只能用于向 SQL Server 表中写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可以加载到 DataTable 实例或使用 IDataReader 实例读取即可。
使用 SqlBulkCopy 类可以执行下列操作:
单次批量复制操作
多次批量复制操作
事务中的批量复制操作
示例1: 单次批量复制操作
private
void
sqlBulkCopy()
{
// 建立连接信息 SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder(); // sqlcsb.DataSource = “SQLProduction”; // sqlcsb.InitialCatalog = “Sales”; // sqlcsb.IntegratedSecurity = true; sqlcsb.ConnectionString = @” data source=myDBServer;user id=sa;initial catalog=myDB;password= “ ; SqlConnection SqlConn = new SqlConnection(sqlcsb.ConnectionString); // 建立获取数据命令 // SqlCommand cmd = new SqlCommand(“SELECT * FROM SG4262010100007”, cnn); // SqlConn.Open(); // SqlDataReader dataReader = cmd.ExecuteReader(); string dbFile = @” C:/20071214.mdb “ ; OleDbConnectionStringBuilder oleConStr = new OleDbConnectionStringBuilder(); oleConStr.ConnectionString = “ Provider=Microsoft.Jet.OLEDB.4.0;Data Source= “ + dbFile + “ ;User Id=admin;Password=; “ ; OleDbConnection OleConn = new OleDbConnection(oleConStr.ConnectionString); OleDbCommand cmd = new OleDbCommand( “ select * from SG4262010100007 “ , OleConn); OleConn.Open(); System.Data.OleDb.OleDbDataReader dataReader = cmd.ExecuteReader(); SqlConn.Open(); SqlTransaction transaction = SqlConn.BeginTransaction(); ; // 创建一个 SqlBulkCopy 对象. SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, transaction); bulkCopy.BatchSize = 10 ; bulkCopy.BulkCopyTimeout = 500000000 ; bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied); bulkCopy.NotifyAfter = 10 ; // 复制数据至目标对象 bulkCopy.DestinationTableName = “ SG4262010100007 “ ; try {
bulkCopy.WriteToServer(dataReader); transaction.Commit(); } catch (Exception err) {
transaction.Rollback(); throw new Exception(err.ToString()); } // 关闭所有的对象 bulkCopy.Close(); dataReader.Close(); OleConn.Close(); SqlConn.Close(); }
void
sbc_SqlRowsCopied(
object
sender, SqlRowsCopiedEventArgs e)
{
showMsg( “ 已完成行数: “ + e.RowsCopied.ToString()); }
private
delegate
void
showMsgDelegate(
string
msg);
private
void
showMsgDel(
string
msg)
{
this .myRichTextBox1.AppendText(msg + System.Environment.NewLine); }
private
void
showMsg(
string
msg)
{
this .BeginInvoke( new showMsgDelegate(showMsgDel), new object [] { msg } ); }
2. 我们可以有选择性的从目标数据选取数据大批量复制至目标对象指定的字段中.
private
void
HasSelSqlBulkCopy()
{
// 建立连接信息 SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder(); // sqlcsb.DataSource = “SQLProduction”; // sqlcsb.InitialCatalog = “Sales”; // sqlcsb.IntegratedSecurity = true; sqlcsb.ConnectionString = @” data source=myDBServer;user id=sa;initial catalog=myDB;password= “ ; SqlConnection SqlConn = new SqlConnection(sqlcsb.ConnectionString); // 建立获取数据命令 // SqlCommand cmd = new SqlCommand(“SELECT * FROM SG4262010100007”, cnn); // SqlConn.Open(); // SqlDataReader dataReader = cmd.ExecuteReader(); string dbFile = @” C:/20071214.mdb “ ; OleDbConnectionStringBuilder oleConStr = new OleDbConnectionStringBuilder(); oleConStr.ConnectionString = “ Provider=Microsoft.Jet.OLEDB.4.0;Data Source= “ + dbFile + “ ;User Id=admin;Password=; “ ; OleDbConnection OleConn = new OleDbConnection(oleConStr.ConnectionString); OleDbCommand cmd = new OleDbCommand( “ select DATETIME,INFOTAG,MSGTEXT from SG4262010100007 “ , OleConn); OleConn.Open(); System.Data.OleDb.OleDbDataReader dataReader = cmd.ExecuteReader(); SqlConn.Open(); SqlTransaction transaction = SqlConn.BeginTransaction(); ; // 创建一个 SqlBulkCopy 对象. SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, transaction); bulkCopy.BatchSize = 10 ; bulkCopy.BulkCopyTimeout = 500000000 ; bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied); bulkCopy.NotifyAfter = 10 ; // 复制数据至目标对象 bulkCopy.DestinationTableName = “ testtb “ ; bulkCopy.ColumnMappings.Clear(); // 设置源对象与目标对象的字段对应关系 SqlBulkCopyColumnMapping column1 = new SqlBulkCopyColumnMapping( “ DATETIME “ , “ date “ ); bulkCopy.ColumnMappings.Add(column1); SqlBulkCopyColumnMapping column2 = new SqlBulkCopyColumnMapping( “ INFOTAG “ , “ flag “ ); bulkCopy.ColumnMappings.Add(column2); SqlBulkCopyColumnMapping column3 = new SqlBulkCopyColumnMapping( “ MSGTEXT “ , “ myValue “ ); bulkCopy.ColumnMappings.Add(column3); try {
bulkCopy.WriteToServer(dataReader); transaction.Commit(); } catch (Exception err) {
transaction.Rollback(); throw new Exception(err.ToString()); } // 关闭所有的对象 bulkCopy.Close(); dataReader.Close(); OleConn.Close(); SqlConn.Close(); }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140657.html 原文链接:https://javaforall.net