批量更新資料庫

2021-09-01 20:10:15 字數 3886 閱讀 4629

前言:最近做了個專案:把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語句更新,最後把原表中不存在的資料獲取到再批量寫入。以下是第二種方式的實現。該方式中有投機取巧的嫌疑,但是確實能對在單機大批量...