2012-09-27 50 views
0

我有一箇中繼器,它在每次迭代中抓取多個表中的數據。現在我打開連接,只要我輸入OnItemDataBound事件並在事件完成之前關閉它。這意味着連接在我的情況下打開和關閉超過1000次。這是正確的方法嗎?有沒有其他方法?中繼器內部打開/關閉數據庫連接

我的代碼基本上看起來像這樣

Protected Sub myRepeater_OnItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) 
    Try 
     mycon.open() 
     Dim RowView As DataRowView = e.Item.DataItem 

     //fetch data from 5 different tables using the data from the datasource (dataset) 

     mycon.close() 
    Catch ex As Exception 

    End Try 
End Sub 
+0

這真的取決於你所需要的數據。是否有可能查詢窗體構造函數中的所有數據並將結果設置爲中繼器數據源?檢查第一個示例:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx –

+0

這是不可能在這種情況下。中繼器正在使用數據集作爲其數據源。我必須使用提供的數據在其他5個表格中查找相關信息。 – atar

+0

那麼我恐怕你可能會被剔除。我會建議分頁您的值,所以你只需要打電話每頁100個查詢。 –

回答

1

其實這是很好的做法,因爲當你使用連接池,你不clocing物理連接,打開/在儘可能小的範圍內立即關閉連接。您只需在關閉它時使連接可用。

但是除此之外,爲什麼您在ItemDataBound中使用連接,之後中繼器已經是數據綁定了? DataItem應該包含您需要的全部內容。如果你想DataBind像DropDownLists或嵌套中繼器的子控件,是的,這是正確的方式(當然,你應該更好地將它封裝在方法中)。

而且你應該使用using-statement處置(接近)連接:

Dim rowView As DataRowView = e.Item.DataItem 
Dim someDropDown = DirectCast(e.Row.FindControl("DropDownList1"), DropDownList) 
Using myCon = New SqlConnection(connectionString) 
    Try 
     mycon.Open() 
     'databind the dropdown...' 
    Catch ex As Exception 
     'log exception' 
    End Try 
End Using 
+0

我從一個單獨的位置獲取數據集(中繼器的數據源),並使用數據表內的數據,我必須在5個不同的表中找到相關數據並使用中繼器顯示它。 – atar