demoshop

demo, trying to be the best_

當初學者需要利用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萬筆這種大筆數本來就不太應該用這方法寫...

回應討論