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

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

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萬筆這種大筆數本來就不太應該用這方法寫...


資料來源:http://demo.tc/view.aspx?id=108

goodlucky 發表在 痞客邦 PIXNET 留言(0) 人氣()