2009年12月14日 星期一

保存DataTable

在window form的程式中,DataSet或DataTable的存續在window form程式設計師眼裡視之理所當然,但是在web form就不是這般,因為web的本質在使用者發出要求(Request),web server依據要求處理後再回應(Response)給使用者,二者之間的關係在工作結束後就中斷了,這些 In memory物件(DataSet、DataTable)就會消失,如果要保留DataSet、DataTable可以利用Session或ViewState來保留,下面介紹利用ViewState使DataTable得以存續

protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
if (ViewState["_dt"] != null)
{
dt = (DataTable)ViewState["_dt"];
}
}

protected override object SaveViewState()
{
ViewState["_dt"] = dt;
return base.SaveViewState();
}

上面的程式片段將利用DataTable存入ViewState及ViewState明確轉型為DataTable,令DataTable得以存續,不過在使用時至少要考慮一些問題
1)系統頻寛
2)系統Loading
因為是存在ViewState所以對於使用者與Server往來的流量就會增加,另外使用者的瀏覽器在解析時也會較慢,還有在ViewState轉型成DataTable也會耗用資源,以上都是在使用時要考量的。

2009年12月10日 星期四

ADO.NET-DataRowState說明

每一個DataRow物件的狀態可能為以下五種其中一種

1)Added
2)Deleted
3)Detached
4)Modified
5)Unchanged

其中Added、Deleted、Modified會對資料來源產生異動。
Added: 對應SqlDataAdapter的InsertCommand
Deleted: 對應SqlDataAdapter的DeleteCommand
Modified: 對應SqlDataAdapter的UpdateCommand

Added狀態 是DataRow加入至DataTable,尚未呼叫AcceptChanges
Deleted狀態 是DataRow利用Delete方法刪除資料列
Modified狀態 是DataRow修改,尚未呼叫AcceptChanges

當SqlDataAdapter物件呼叫Update方法時就是利用DataTable中每一筆DataRow的狀態去對應適合的Command物件

ADO.NET-SqlDataAdapter簡介(1)

在ADO.NET中,SqlDataAdapter所扮演的角色,其實是SQL Server(資料來源)與In memory資料庫(DataSet)的橋樑,SqlDataAdapter有四個屬性分別對應查詢、新增、修改、刪除的SqlCommand物件

1) SelectCommand屬性,功用為自資料來源擷取資料至DataSet裡的資料表
2) InsertCommand屬性,回寫資料來源前需設定
3) UpdateCommand屬性,回寫資料來源前需設定
4) DeleteCommand屬性,回寫資料來源前需設定

範例如下
*因篇幅關係,大部份程式碼略過

//SelectCommand結果填入DataTable
//cmd做為SelectCommand屬性
//dt為DataTable
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);

//回寫資料來源
//insCmd為一個以新增資料的SqlCommand物件
//updateCmd為一個以修改資料的SqlCommand物件
//delCmd為一個以刪除資料的SqlCommand物件
da.InsertCommand = insCmd;
da.UpdateCommand = updateCmd;
da.DeleteCommand = delCmd;
da.Update(dt);

在SqlDataAdapter物件做回寫至資料來源時,會引用DataTable物件,並依據每一筆資料列的DataRowState去對應到適合的SqlDataAdapter Command屬性