1. 程式人生 > >c#向Access資料庫中批量插入大量記錄的方法

c#向Access資料庫中批量插入大量記錄的方法



最近有同事離職,我把他經手的專案接了過來,其中有一個功能,經過長時間運算以後,產生了17W條左右的記錄,一次性儲存到資料庫中,每次介面要卡頓1分鐘多,很是鬧心,決定修改一下

【基本情況】

c#、nhibernate、Access資料庫

【解決思路】

1、據說第一版本的實現,採用了nhibernate的save實體物件的方法,慢出翔了

2、然後作者改了第二版,思路是用OleDb,開啟資料庫連結以後,先生成17W+的sql的insert語句,然後迴圈遍歷執行,向資料庫中寫入記錄,依然慢的很,耗時1.5分鐘左右

3、然後我改了第三版,思路依然是OleDb,然後是採用引數賦值的方法,構造OleDbParameter,然後迴圈修改引數,項資料庫中寫入記錄,然後我就斯巴達了,沒有效能提升!!!

我思考了一下,這種方式在Oracle中,應該是可以省略掉sql語言編譯,可以加快一點速度,但是放到access中,沒研究過,機制不懂啊

4、然後開始問百度

     在某論壇找到思路:在Access中,弄個儲存過程,然後按照OleDb呼叫儲存過程的方式來進行批量插入,我試了一下,真心坑,效率更低了

5、然後只能問谷歌

     找到下面這個連結,讓我真的很欣慰(有興趣的人可以看一下,作者嘗試了很多種辦法來提速,值得學習):

     http://stackoverflow.com/questions/7070011/writing-large-number-of-records-bulk-insert-to-access-in-net-c


6、最後,編寫自己的程式碼,結果是喜人的,5秒完成工作,提速10~15倍

     名稱空間:using DAO = Microsoft.Office.Interop.Access.Dao;

     程式碼正文:

[csharp] view plain copy print ?
  1. DAO.DBEngine dbEngine = new DAO.DBEngine();  
  2. DAO.Database db = dbEngine.OpenDatabase(databasePath);  
  3.   
  4. DAO.Recordset rs = db.OpenRecordset("Table");  
  5. DAO.Field[] myFields = new DAO.Field[9];  
  6. myFields[0] = rs.Fields["F_TYPE"];  
  7. myFields[1] = rs.Fields["F_TAG"];  
  8. myFields[2] = rs.Fields["F_RULEID"];  
  9. myFields[3] = rs.Fields["F_SOURCEID"];  
  10. myFields[4] = rs.Fields["F_TAGID"];  
  11. myFields[5] = rs.Fields["F_DESCRIPTION"];  
  12. myFields[6] = rs.Fields["F_TASKID"];  
  13. myFields[7] = rs.Fields["F_RULEGROUP"];  
  14. myFields[8] = rs.Fields["F_RULENAME"];  
  15.   
  16. int strTagKey = -1;  
  17. for (int i = 0; i < sList.Count; i++)  
  18. {  
  19.     int key;  
  20.     if (int.TryParse(sList[i].TagKey, out key))  
  21.         strTagKey = string.IsNullOrEmpty(sList[i].TagKey) ? -1 : int.Parse(sList[i].TagKey);  
  22.   
  23.     rs.AddNew();  
  24.   
  25.     myFields[0].Value = sList[i].RuleGroup;  
  26.     myFields[1].Value = sList[i].Tag;  
  27.     myFields[2].Value = sList[i].CheckRule.Key;  
  28.     myFields[3].Value = strTagKey;  
  29.     myFields[4].Value = strTagKey;  
  30.     myFields[5].Value = sList[i].Description;  
  31.     myFields[6].Value = nTaskID;  
  32.     myFields[7].Value = sList[i].RuleGroup;  
  33.     myFields[8].Value = sList[i].RuleName;  
  34.   
  35.     rs.Update();  
  36.   
  37. }  
  38. rs.Close();  
  39. db.Close();  
  40.   
  41. return true;  
                DAO.DBEngine dbEngine = new DAO.DBEngine();
                DAO.Database db = dbEngine.OpenDatabase(databasePath);

                DAO.Recordset rs = db.OpenRecordset("Table");
                DAO.Field[] myFields = new DAO.Field[9];
                myFields[0] = rs.Fields["F_TYPE"];
                myFields[1] = rs.Fields["F_TAG"];
                myFields[2] = rs.Fields["F_RULEID"];
                myFields[3] = rs.Fields["F_SOURCEID"];
                myFields[4] = rs.Fields["F_TAGID"];
                myFields[5] = rs.Fields["F_DESCRIPTION"];
                myFields[6] = rs.Fields["F_TASKID"];
                myFields[7] = rs.Fields["F_RULEGROUP"];
                myFields[8] = rs.Fields["F_RULENAME"];

                int strTagKey = -1;
                for (int i = 0; i < sList.Count; i++)
                {
                    int key;
                    if (int.TryParse(sList[i].TagKey, out key))
                        strTagKey = string.IsNullOrEmpty(sList[i].TagKey) ? -1 : int.Parse(sList[i].TagKey);

                    rs.AddNew();

                    myFields[0].Value = sList[i].RuleGroup;
                    myFields[1].Value = sList[i].Tag;
                    myFields[2].Value = sList[i].CheckRule.Key;
                    myFields[3].Value = strTagKey;
                    myFields[4].Value = strTagKey;
                    myFields[5].Value = sList[i].Description;
                    myFields[6].Value = nTaskID;
                    myFields[7].Value = sList[i].RuleGroup;
                    myFields[8].Value = sList[i].RuleName;

                    rs.Update();

                }
                rs.Close();
                db.Close();

                return true;

7、上面程式碼的解釋

              其實沒什麼好解釋的,sList裡面放了17W+的物件,一個一個插入即可

              Microsoft.Office.Interop.Access.Dao直接在VS中新增引用即可