2013-06-26 70 views
0

基本上我有一個網站,我正在努力在哪裏將有超過8個列表框充滿了來自數據庫的信息。我目前使用SqlDataSource,因爲易於使用,我目前使用它將數據綁定到列表框。SqlDataSource是否始終保持數據庫連接處於打開狀態?

是否SqlDataSource離開連接打開的全部時間?爲了安全起見以及性能原因,我想從網站體系結構角度消除任何不必要的持續開放連接。

+1

_「我喜歡SqlDataSource,因爲易用性」_ - 但您是否曾考慮過結果的質量(可維護性)? –

回答

1

直接在回答你的問題:第SqlDataSource控件確保連接儘快關閉,因爲它需要執行一直運行完成。

+0

有沒有一種方法可以根據需要再次打開它以重新填充初始羣體之後的列表?或者每次我想運行一個新的selectCommand時,是否需要重新初始化它? –

+0

您不需要每次都創建一個新實例。您可以更改SelectCommand,根據需要清除任何現有參數,如果需要添加新參數,然後調用Datasource的Select方法。 –

0

我以前使用的SqlDataAdapter + SqlCommand的,但現在我主要使用

using(SQLDataReader rdr = <YourSQLCommandVariable>.ExecuteReader()) 
{ 
    rdr.Load(<YourDataTableVariable)) 
} 

原因是我不能確定什麼樣的數據適配器沒有在數據讀取器的頂部,以允許它做更新的批次,讀取和刪除。如果你仔細想想,編寫一個類似數據適配器的類可以做到這一點,而不會引入任何開銷,這將是非常困難的。開銷可能並不重要,但除非我將多個表從查詢中讀取到DataSet對象中,否則我不會冒這個風險。

之所以這麼說,我懷疑這些操作的任何開銷是值得甚至考慮,如果你在本地緩存中的所有結果數據到本地機器。換句話說,如果數據在一段時間內不可能發生變化,那麼對SQL查詢所做的最大改進就是不要讓它們生效。如果數據每天更新一次,請將其緩存24小時或更少。如果緩存是依賴於最終用戶或通過HttpContext.Current.Cache對象,則可以通過Session進行緩存。

0

這聽起來像你可能想在你的應用程序中分離一些層。 Web項目完全不瞭解數據庫。理想情況下,有一些中間層程序集可以處理與數據庫的通信。然後從你的.aspx.cs或Controller,取決於你是否使用MVC,你可以對中間層進行8次調用(每個列表框假設他們有不同的信息)。中間層會返回類似於List<MyObject>的內容,然後您將綁定到列表框。

我對數據訪問的典型模式是這樣的

using (SqlConnection conn = new SqlConnection("conn string")) 
{ 
    conn.Open(); 
    SqlCommand command = new SqlCommand() 
    { 
     CommandText = "command text", 
     Connection = conn, 
     CommandType = CommandType.StoredProcedure //could be non-stored proc.. but would reccomend stored proc assuming SQL Server 
    }; 

    command.Parameters.Add(new SqlParameter("MyParam", "param1")); 
    command.Parameters.Add(new SqlParameter("MyParam2", "param2")); 

    IDataReader reader = command.ExecuteReader(); 

    while(reader.Read()) 
    { 
    //magic here 
    } 

    conn.Close(); 
} 
相關問題