目錄數據庫
開個貼,專門記錄使用EF Core遇到的問題,之後本身用.net寫東西,操做數據庫就使用EF Core了c#
我須要導入600多個csv文件,批量導入不會弄,網上也沒查.net
使用了讀取再存儲的方法code
能夠看下面的代碼每一行存一次,這種方法的速度差很少是每秒400多條數據的樣子ci
foreach (var csvName in 600個文件) { foreach (var 每一行 in 全部行) { using (var context = new MyContext()) { context.dGKs.Add(dGK); context.SaveChanges(); } } }
我感受是using (var context = new MyContext())這個的問題,由於using括號內就是一次對數據庫的連接和釋放,因此我把代碼改爲下面這樣了,結果大跌眼鏡it
using (var context = new MyContext()) { foreach (var csvName in 600個文件) { foreach (var 每一行 in 全部行) { context.dGKs.Add(dGK); context.SaveChanges(); } } }
上面這樣,我覺得只有一次的連接釋放會快一點,沒想到更慢了,方法1每秒400多條數據,方法2這樣每秒只有幾十條,真的慢class
通過方法2,我又想了,屢次add,而後一次SaveChanges,這樣會不會快一點?代碼又改爲了下面這樣foreach
using (var context = new MyContext()) { foreach (var csvName in 600個文件) { foreach (var 每一行 in 全部行) { context.dGKs.Add(dGK); } context.SaveChanges(); } }
這樣的結果也很很差,首先半天沒反應,有反應了數據庫忽然出現幾萬條數據,這和方法1每秒400條/s的速度也差很少啊csv
缺點還有:方法
因此,根據以上兩個缺點,方法3也不好勁
因此,我最後仍是改成了方法1
問題描述,有一個字段是字符類型的,例如: "12.123","None"
我想判斷這個字段是否是數字,不是數字的話直接改成"0",由於數據庫裏面的字段直接設定的Decimal類型
而後,我腦殘的使用了try catch,仍是在using內部使用的,以下
using (var context = new MyContext()) { try{ dgk.aaa = int.Prase(dgk.aaa).toString(); } catch{ dgk.aaa = "0"; } context.dGKs.Add(dGK); context.SaveChanges(); }
速度真的是超級慢了,每秒才30多條數據,慢死,catch真的耗時間
因此我換成了正則,話說,我一直不會正則
using (var context = new MyContext()) { if (!Regex.IsMatch(dGK.aaa, @"^\d+\.\d+$")) { dGK.aaa = "0"; } context.dGKs.Add(dGK); context.SaveChanges(); }
換了正則以後和方法1差很少了,每秒400多條