2010年12月9日 星期四

C# 將資料大量寫入資料庫時的優化寫法

當初學者需要利用for迴圈寫入資料時,常常會犯一個錯誤,就是SqlConnection開開關關,迴圈跑100次它就活生生開關一百次,雖然資料量小時看不出影響但這是相當浪費效能與資源的寫法,只要改變寫作習慣就可以避免掉這問題,來看看吧。

demo以GridView1秀出資料後再把它全部寫入到一個名為Table1的資料表。

以下是一般初學者會寫的code
for (int i = 0; i < this.GridView1.Rows.Count; i++) 
{
SqlConnection conn = demotools.getSqlConnection();//此為demo取得SqlConnection的方法
SqlCommand comm = new SqlCommand("INSERT INTO [Table1] ([name]) VALUES (@name)", conn);
conn.Open();
comm.Parameters.AddWithValue("name", this.GridView1.Rows[i].Cells[1].Text);
comm.ExecuteNonQuery();
conn.Dispose();
comm.Dispose();
}

沒錯這樣寫是可以正常的寫入資料庫,但是因為開關連結的方式包含在for迴圈內所以就會發生前文所說得問題,瘋狂的開關,為了節省效能我們應該這樣寫
SqlConnection conn = demotools.getSqlConnection(); 
SqlCommand comm = new SqlCommand("INSERT INTO [Table1] ([name]) VALUES (@name)", conn);
//以上都應該放在for迴圈外(除非你會變動=.=)

int i;
//宣告變數也應該放在外面不應該在for內

conn.Open();//開啟連結拿出來了

for (i = 0; i < this.GridView1.Rows.Count; i++)
{
comm.Parameters.Clear();//清除掉目前宣告出來的Parameters
comm.Parameters.AddWithValue("name", this.GridView1.Rows[i].Cells[1].Text);
comm.ExecuteNonQuery();
}
conn.Dispose();
comm.Dispose();


測試環境:SQL2005 Express
測試資料量:10萬筆
測試次數:10次
平均秒數:64.4867秒

這樣子的寫法是demo目前會的最好的寫法,當然我還很嫩其他的大大一定有更好的寫法還請多指教...當然其中還可以加上交易等判斷但那些不是此篇的重點所以demo以最簡單的方式寫出來,希望此篇對您會有所幫助,或許你懷疑SQL怎麼會那麼慢,請注意測試環境使用的是Express版本,並且10萬筆這種大筆數本來就不太應該用這方法寫...

沒有留言:

張貼留言