批量匯入 更新 資料的幾種方法

2021-08-07 02:32:21 字數 3018 閱讀 1607

在工作中經常遇到要匯入資料的場景。

1 匯入全新的資料

2 匯入的資料中庫中可能已經存在,已經存在的資料不能覆蓋,不能變更

3 匯入的資料中庫中可能已經存在,已經存在的資料主鍵等不能變化,同時需要更新這些資料的一些字段(比如:積分字段)

第一種最簡單,最坑爹的是第三種了。

新手碰到這種問題往往一籌莫展,能想到的最直接的辦法就是 一條條獲取 ,然後判斷,然後 update。這種方式的效率在少量資料的時候還沒太大問題,當達到上千上萬條時候問題就會出現了。

這種處理方式的資源開銷和效率簡直「慘絕人寰」。我也經歷過這種方式,並漸漸的了解是應用了更高效的方式。

一、一條條的插入/獲取判斷和更新

這種方式上文已經說了效率和資源開銷都是最大的,沒啥好講的,做程式的都會

二、一次插入多條/一次更新多條

1

public

static

void executesqltran(list sqlstringlist)//

sqls220

}21tx.commit();22}

23catch

(system.data.sqlclient.sqlexception e)

2428

}29 }

view code

這種的方式效率會比  一  高很多,但是資源開銷和執行效率還是難以讓人忍受,在一次執行語句數量達到萬級時候就表現的很明顯。

我工作中的一次案例資料庫中資料有2300w條記錄,要對比的資料有20w條記錄時候  純update語句 1w條資料時候需要等待100s左右,當要對比的資料為40w條時候需要等待時間是600s左右。這種方式在效率上是相當讓人無法忍受的。

三、使用dataset更新記錄

1

///2

///利用dataset批量更新資料

3///

4///56

public

void batchupdatafordataset(string

sqlstring)723

24 sqlcommandbuilder scb = new

sqlcommandbuilder(da);

25//

執行更新

26 da.insertcommand =scb.getupdatecommand();

27da.update(ds);

28//

使datatable儲存更新

29ds.acceptchanges();

3031}32

catch

(system.data.sqlclient.sqlexception ex)

3336}37

}38 }

view code

在**中我使用了委託dataupwork來處理dataset中的資料,隨後提交。

這種方式寫**可能會輕鬆很多,但是效率也是不盡人意,好像最終也是生成update語句批量執行的,具體沒有細細研究,請知道的大神指出這種方式的工作原理。

這種方式同樣不能同時執行插入資料的操作(個人沒測試過,不知道對dataset新增的資料會不會插入到資料庫中。(/ □ \))

四、 使用sqlbulkcopy批量插入全新的資料

這個批量插入效率真的極高,插入10w也是瞬間完成,參考**

1

///2

///使用原列列表、目標列表和目標表明及資料記錄數在指定的時間將資料批量匯入到資料庫

3///

4///

源列name

5///

目標列name

6///

目標表名

7///

資料來源8

///指定時間

9public

static

void batchinput(list sourcecolumnname, list dbtablecolumnname, string tablename, datatable sourcedt, int timeout = 300 ,string exsql="")10

1516

17 sqlconnection sqlconn = new

sqlconnection(connectionstring);

18 sqlbulkcopy bulkcopy = new

sqlbulkcopy(sqlconn);

19 bulkcopy.bulkcopytimeout =timeout;

2021

//目標表

22if (string

.isnullorempty(tablename))

2326

27 bulkcopy.destinationtablename =tablename;

2829

3031

for (int i = 0; i < sourcecolumnname.count; i++)

3237

//匯入的資料量

38 bulkcopy.batchsize =sourcedt.rows.count;

3940

try41

4849

if (bulkcopy.batchsize != 0)50

53}54catch

(exception ex)

5558

finally

5967

68sqlconn.close();69}

7071

72 }

view code

但是該方法只能插入全新的記錄,對於已經存在的資料無能為力了,不會去除已經存在的記錄項,更不能更新已經存在的記錄項

mybaits批量更新的幾種方法

update shop manager set marketing category where id 示例 update shop manager marketing category where entity id mybatis沒有直接提供批量更新的語句但是我們可以利用mysql的case w...

Python 匯入模組的幾種方法

下級資料夾 子目錄 上級資料夾 父目錄 當你匯入乙個模組,python 解析器搜尋模組的順序是 當前目錄 shell 變數 windows環境變數 pythonpath 記錄的每個目錄。folder1 mod1.py mod2.py import module1 module2 modulen mo...

hibernate更新部分欄位的幾種方法

1.使用hql語句,寫的 多,但很靈活 public void update 2.設定屬性的不可更新性 例如a 乙個屬性註解設定updatable false或者xml設定update true b 或者xml中設定 dynamic update true a,簡單卻不靈活,因為b能動態決定更新 但...