實際的開發可能會遇到資料大批量插入資料的問題,若是一條條的迴圈倒數效率非常低下,這個較好的解決方案
protected void Button1_Click(object sender, EventArgs e)
{
DateTime beginTime = DateTime.Now;
Response.Write("開始時間:" + beginTime.ToString("yyyy年MM月dd日:HH:mm:ss:fff"));
//構造一個Datatable儲存將要大量匯入的資料
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("name", typeof(string));
// 見識下SqlBulkCopy強悍之處,來個十萬條數資料實驗
int i;
for (i = 0; i < 100000; i++)
{
DataRow dr = dt.NewRow();
dr["name"] = i.ToString();
dt.Rows.Add(dr);
}
string str = ConfigurationManager.ConnectionStrings["connStr"].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 = "dbo.text";
//自訂的datatable和資料庫的欄位進行對應
sqlBC.ColumnMappings.Add("id", "tel");
sqlBC.ColumnMappings.Add("name", "neirong");
//批量寫入
sqlBC.WriteToServer(dt);
}
conn.Dispose();
Response.Write("<br/>");
DateTime endTime = DateTime.Now;
Response.Write("結束時間:" + endTime.ToString("yyyy年MM月dd日:HH:mm:ss:fff"));
TimeSpan useTime = endTime-beginTime;//使用時間
Response.Write("<br/>插入時間:"+ useTime.TotalSeconds.ToString()+"秒");
}
//響應時事件
void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
Response.Write("<br/> OK! ");
}