你都應該儘可能晚地打開連接,並儘快將其關閉。所以我通常有返回DataTable,看上去就像一個方法:
public DataTable GetUsersRightsForProject(int ProjectId)
{
SqlCommand cmd = GetNewCmd("dbo.GetUsersRightsForProject");
cmd.Parameters.Add("@ProjectId", SqlDbType.Int).Value = ProjectId;
return GetTable(cmd);
}
的GetTable是,我用我所有的項目我的基類的方法。
protected DataTable GetTable(SqlCommand objCmd)
{
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
try
{
da.SelectCommand = objCmd;
da.Fill(dt);
}
catch (Exception ex)
{
LogException(ex);
throw ex;
}
finally
{
Close(objCmd);
da.Dispose();
da = null;
}
return dt;
}
請注意,我儘可能晚地打開連接 - da.Fill(dt)實際打開並關閉它。然後我再次檢查它是否在「最後」部分關閉。我的基類需要得到連接字符串,記錄任何異常的照顧和我有類似這樣的一個GetDataSet,包裝的ExecuteScalar等
所以,我可以綁定到這樣一個GridView:
GridView1.DataSource = cApp.DB.GetUsersRightsForProject(ProjectId);
GridView1.DataBind();
(通常你在中間的那個業務對象。)
我的模式通常是:
- 創建新表。
- 創建存儲過程以獲取數據和保存數據。
- 創建調用存儲過程的數據訪問層方法(如上面的第一種方法)。
這些編碼的一些可能是單調乏味的,特別是如果你的表有很多列。所以我寫了2個存儲過程來幫助解決這個問題。根據表生成一個「保存」存儲的proc代碼。第二個基於存儲的proc生成數據訪問方法代碼。
他們可以發現here
爲了把細點對我的評論如下,你爲什麼要綁定到一個DataReader,而不是改變着的DataReader到一些中介對象第一?優化? – 2009-07-20 17:20:35