前言:最近做了個專案:把txt檔案中的資源資訊全量更新到資料庫中,拿到這個專案後,我首先考慮到效能問題應該是個大問題,於是想到了用批處理解決,但是批處理不能支援事物回滾,且只能一條一條sql執行,效率雖然比直接更新資料庫要快,且不占用cpu。經諮詢有一種更好的方法,就是先用c#自帶提供的方法sqlbulkcopy批量更新到臨時表中,然後聯表執行sql進行更新,插入表的效率很高,50萬資料只用5秒左右,更新一百萬資料用了4分鐘,比起批處理用12分鐘效率高了很高,且如果插入失敗還可以實物回滾,很好,嘿嘿
下面給出sqlbulkcopy的具體方法:
public class bulkcopyhelper
///
/// 入庫的資料庫表名稱
///
private string tablename;
public string tablename
get
set
///
/// 待插入的資料來源
///
private datatable insertsource;
public system.data.datatable insertsource
get
set
///
/// 資料庫的連線串
///
private string sqlconnection;
public string sqlconnection
get
set
///
/// 資料屬性與資料庫字段對應關係
/// key:屬性
/// value:資料庫字段
///
private dictionarycolumnnames;
public dictionarycolumnnames
get
set
///
/// 每次入庫的大小
///
private int batchsize;
public int batchsize
get
set
public bulkcopyhelper()
public bulkcopyhelper(string tablename, string sqlconnection, int batchsize,datatable insertsource)
this.tablename = tablename;
this.sqlconnection = sqlconnection;
this.insertsource = insertsource;
this.batchsize = batchsize;
///
/// 自動對映欄位名
///
private void autosetcolumns()
if (columnnames == null || columnnames.count == 0)
columnnames = new dictionary();
foreach (datacolumn column in insertsource.columns)
columnnames.add(column.columnname, column.columnname);
///
/// 批量的插入
///
///
public bool excutebulkcopy()
//判斷是否可以插入
if (string.isnullorempty(tablename))
throw new sqlnullvalueexception("表名不能為空");
if (insertsource == null || insertsource.rows.count == 0)
return true;
//宣告連線字串
sqlconnection conn = new sqlconnection(sqlconnection);
conn.open();
sqltransaction sqlbulktransaction = conn.begintransaction();
//宣告 sqlbulkcopy
sqlbulkcopy sqlbc = new sqlbulkcopy(conn, sqlbulkcopyoptions.checkconstraints, sqlbulktransaction);
//設定乙個批,寫入多少條記錄
sqlbc.batchsize = batchsize != 0 ? batchsize : 5000;
//設定超時的秒數
sqlbc.bulkcopytimeout = 1200;
//設定要寫入的資料庫
sqlbc.destinationtablename = tablename;
//對應資料行
autosetcolumns();
foreach (string columnname in columnnames.keys)
try//開始寫入
sqlbc.writetoserver(insertsource);
//提交事務
sqlbulktransaction.commit();
return true;
catch (exception exception)
sqlbulktransaction.rollback();
throw;
finally
sqlbc.close();
conn.close();
呼叫方法:
public bool insertresourceinfotodb(hashtable table, ref string errorinfo)
try//1、清空表中的資料
string sql = "truncate table cpresourcenoandhotno";
if (!db.executeupdate(sql, ref errorinfo))
return false;
//轉換成datatable
datatable insertttable = new datatable();
insertttable.columns.add("cpresourceno");
insertttable.columns.add("hotnum");
//2、批量插入資料
foreach (string cpreousrceno in table.keys)
int hotno;
string hotnostr = table[cpreousrceno].tostring();
if (!int.tryparse(hotnostr.split('.')[0], out hotno))
continue;
datarow row = insertttable.newrow();
row.beginedit();
row["cpresourceno"] = cpreousrceno;
row["hotnum"] = hotno;
row.endedit();
insertttable.rows.add(row);
bool res = db.batchbulkcopyinsert(insertttable, "cpresourcenoandhotno");
insertttable.rows.clear();
return res;
catch (exception ex)
return false;
注:cpresourcenoandhotno表有兩個字段:cpresourceno,
hotnum
資料庫批量更新維護
情況 多台資料庫伺服器,每台伺服器多個資料庫,資料庫結構一致 提供給不同客戶使用 一 手工操作 1 資料庫少 下拉列表選擇不同資料庫,執行更新指令碼sql.資料庫少,操作感覺不到麻煩。2 資料庫多 下拉列表選擇不同資料庫,操作麻煩,容易遺漏更新資料庫。sql server management st...
資料庫學習 update(批量更新)
資料更新update命令 用指定要求的值更新指定表中滿足天劍的資料的指定列的值 語法形式 update 表名 set 列名 表示式 子查詢 列名 表示式 子查詢 where 條件表示式 示例 1 將所有教師工資上調 10 原表資料 執行兩次後結果 2 將所有計算機學院的老師工資上調 10 updat...
C 批量更新sql server資料庫資料
批量更新有兩種策略 第一種方式 拼接所有更新字串,在資料庫一次性執行,這樣減少資料更新時頻繁的連線斷開資料庫。第二種方式 把要更新的資料寫入資料庫全域性臨時表,然後利用sql語句更新,最後把原表中不存在的資料獲取到再批量寫入。以下是第二種方式的實現。該方式中有投機取巧的嫌疑,但是確實能對在單機大批量...