摘自:http://hi.baidu.com/s__wind/item/2af5f23a31d189fa97f88d5e
http://www.cnblogs.com/wz327/archive/2011/07/05/2098356.html
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace WFM_SANY_SPDM
{
public class SqlBulk
{
public void InsertTable(DataTable dt, string TabelName,DataColumnCollection dtColum)
{
string str = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();
//聲明數據庫連接
SqlConnection conn = new SqlConnection(str);
conn.Open();
//聲明SqlBulkCopy ,using釋放非託管資源
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
{
//一次批量的插入的數據量
sqlBC.BatchSize = 1000;
//超時之前操作完成所允許的秒數,如果超時則事務不會提交 ,數據將回滾,所有已複製的行都會從目標表中移除
sqlBC.BulkCopyTimeout = 60;
//設定 NotifyAfter 屬性,以便在每插入10000 條數據時,呼叫相應事件。
sqlBC.NotifyAfter = 10000;
// sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
//設置要批量寫入的表
sqlBC.DestinationTableName =TabelName;
//自定義的datatable和數據庫的字段進行對應
//sqlBC.ColumnMappings.Add("id", "tel");
//sqlBC.ColumnMappings.Add("name", "neirong");
for (int i = 0; i < dtColum.Count; i++)
{
sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
}
//批量寫入
sqlBC.WriteToServer(dt);
}
conn.Dispose();
}
//響應時事件
void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
// Response.Write("<br/> OK! ");
}
}
}
用SqlBulkCopy批量插入數據 遇到的錯誤
錯誤一:來自數據源的 String 類型的給定值不能轉換爲指定目標列的類型 nvarchar。
還有其他的錯誤如:AddTime不能爲DBNull (這個應該是目標表中AddTime要求不許爲null),哈哈,錯誤多了,都忘記了。。。
可能的原因有兩種
- 可能是有"'"(單引號),替換成““”(雙引號)。
- 可能是目標表字段的長度比要導入的數據長度小。
錯誤二:給定的 ColumnMapping 與源或目標中的任意列均不匹配。
可能的原因
1.源數據的字段名稱和目標數據的字段名稱不匹配(大小寫敏感的,這個要加強注意啊!)
如:UserName 和 Username ,這樣就不行