這是一個效率最高的sql數(shù)據(jù)表轉(zhuǎn)sql語句的工具。
這兩天公司讓做一個導(dǎo)數(shù)據(jù)的功能,從Excel文件中將數(shù)據(jù)導(dǎo)出并插入到數(shù)據(jù)庫中,起初我是循環(huán)每一行數(shù)據(jù),然后一條一條的將數(shù)據(jù)插入,這樣做雖然功能上 沒什么問題,但是如果數(shù)據(jù)量大的話,會很影響性能。于是在高人的指點下學(xué)習(xí)了SQLBulkCopy類,該類主要用于批量遷移數(shù)據(jù)到數(shù)據(jù)庫中,至于數(shù)據(jù)源 不加限制,只要數(shù)據(jù)可以加載到DataTable或是IDataReader,就可以利用該類批量導(dǎo)入。下面貼一個例子:
protected void butBulkCopy_OnClick(object sender, EventArgs e)
{
string ConStr = "database=TEST;uid=sa;pwd=sa;server=(local)";
//使用SqlBulkCopy把內(nèi)存表DataTable里的數(shù)據(jù)插入答卷數(shù)據(jù)表
using (SqlBulkCopy bcp = new SqlBulkCopy(ConStr))
{
//指定目標(biāo)數(shù)據(jù)庫的表名
bcp.DestinationTableName = "ARTICLE";
//建立數(shù)據(jù)源表字段和目標(biāo)表中的列之間的映射
bcp.ColumnMappings.Add("T", "TITLE");
bcp.ColumnMappings.Add("C", "CONTENTS");
bcp.ColumnMappings.Add("D", "DATA");
//定義生成通知事件之前 要處理的行數(shù)
bcp.NotifyAfter = 1000;
//處理完要處理NotifyAfter的行數(shù)時觸發(fā)的事件
bcp.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnRowsCopied);
//寫入數(shù)據(jù)庫表
bcp.WriteToServer(dt);
//關(guān)閉SqlBulkCopy實例
bcp.Close();
}
}
private void OnRowsCopied(object sernder, SqlRowsCopiedEventArgs e)
{
Response.Write(e.RowsCopied.ToString());
}
DestinationTableName屬性定義了要復(fù)制表的目標(biāo)名稱
ColumnMappings返回一個SqlBulkCopyColumnMapping項集 合,SqlBulkCopyColumnMappingCollection.Add 方法參數(shù)為數(shù)據(jù)源類名稱,目標(biāo)表中目標(biāo)列的名稱.也可以先定義一個SqlBulkCopyColumnMapping,然后使用Add方法添 加,SqlBulkCopyColumnMapping主要用于與目標(biāo)數(shù)據(jù)表的表結(jié)構(gòu)不一致的情況
NotifyAfter指定生成通知事件之前要處理的行數(shù),指定在每次處理行完成的時候發(fā)生的事件,比如每次復(fù)制了1000行以后就提示1000行復(fù)制完成
NorthWindBulkOp.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnRowsCopied);
最后WriteToServer方法,把SqlDataReader復(fù)制到指定的表中。
- PC官方版
- 安卓官方手機版
- IOS官方手機版