討論區快速選單
知識庫快速選單
討論區最近新進100則主題 傑米的攝影旅遊筆記 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
請益,資料存取元件的架構設計
更改我的閱讀文章字型大小
作者 : subbug(賽伯蛀蟲) 人氣指數超過50000點
[ 貼文 176 | 人氣 55632 | 評價 540 | 評價/貼文 3.07 | 送出評價 9 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/7 下午 04:35:52
請益,資料存取元件的架構設計

小弟有個資料存取共用元件,的架構設計問題,想請教各位大大的意見。

小弟目前在幫公司寫一些 db access 的共用元件,放在 App_Code 資料夾裡,給其他 programmer 使用。

目前分成兩條線:

(一) 即時連線存取:
(1) connection - Dbcommand - DataReader → 查詢 (即 select,給 DropDownList、Label、TextBox 顯示用)
(2) connection - Dbcommand → 新增、修改、刪除 (透過 DbCommand.ExecuteNonQuery() 寫入資料庫)

(二) 離線存取:
(1) connection - DbCommand - DataAdapter - DataSet → 查詢 (即 select,給 GridView、FormView 顯示用)
(2) connection - DbCommand - DataAdapter - DataSet → 新增、修改、刪除 (透過 DataAdapter.Update() 寫入資料庫)


但目前上述 (二) 的 (2) 有問題,因該種寫入做法,要先把想寫回資料庫的 DataSet,當作參數傳給我寫的函數,
但目前在 App_Code 資料夾中我的元件的函數,發現在系統前端的各個頁面中,ObjectDataSource 或 SqlDataSource 的
Parameter、UpdateParameters、InsertParameters、…等 參數物件,無法把 DataSet 型別當作 Parameters 參數物件傳遞,
而只能傳入一般的 字串、整數、日期 之類的型別,當作函數的參數,如下:


// ****** App_Code 資料夾中的元件,透過 OleDbCommand.ExecuteNonQuery() 去 Insert 資料 ******
public int InsertDAL_ByOleDbCommand(int intCustID, string strName,「其他參數,但目前問題是各頁面的 ObjectDataSource Parameter無法傳入 DataSet」)
{
  string strConnString = System.Configuration.ConfigurationManager.ConnectionStrings[取得連線設定].ToString();
  int intInsertedRowCount = 0;  // 傳回受異動的資料列數目

  string sql = "INSERT INTO customer (cust_id, name, address) VALUES(?,?,?)";

    OleDbConnection odConn = new OleDbConnection(strConnString);
    OleDbCommand odCmd = new OleDbCommand(sql, odConn);

  // 開啟 Connection ...

  OleDbCommand1.Parameters.Add("@CustomerID", OleDbType.Integer).Value = intCustID;
  OleDbCommand1.Parameters.Add("@CustName", OleDbType.VarChar, 20).Value = strName;
  
  // 其他程式碼 …
  intInsertedRowCount = odCmd.ExecuteNonQuery();

}

在 App_Code 資料夾中的共用元件也因此無法更新 DataSet。想請問有無大大可提供意見?謝謝。


-------------

小弟目前的做法,是把原來 (二) 的 (2),亦即 DataSet / DataTable 的新增、修改、刪除,
改成用 (一) 的 (2) 的即時連線做法,直接更新回資料庫,而不是透過伺服器記憶體中的 DataTable / DataAdapter.Update(),
但發現這樣做也是可以運作得好好的。

亦即像 GridView 等 UI 控制項,取得 (Select) 資料時是用 (二) (1) 的 DataSet / DataTable 取得資料,
但新增、修改、刪除時,是用 (一) 的 (2) 去直接寫回資料庫,而不透過記憶體中的 DataSet / DataTable。

但這樣也是運作得好好的,想請問大大們,這樣做是否有什壞處?如會較浪費資源,或只是沒用到離線存取的好處而已。


謝謝各位。




效能狂 敬上

contempt@pchome.com.tw
作者 : subbug(賽伯蛀蟲) 人氣指數超過50000點
[ 貼文 176 | 人氣 55632 | 評價 540 | 評價/貼文 3.07 | 送出評價 9 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/8 上午 01:04:44
小弟之前卡的問題點,在於共用的資料存取元件(例如放在 App_Code 資料夾中),
也就是 ObjectDataSource 要存取的自訂類別和自訂函數,
無法捉到各頁面中 code-behind 中,想去更新的 DataSet / DataTable 是哪一個,
(無法把 DataSet 當作 Parameter 參數,傳給共用元件的自訂函數),

因此無法知道,要由共用元件去將伺服器記憶體中的哪個 DataSet 或 DataTable 實際
Update 回資料庫。

若是由各個頁面的 code-behind 去經由 DataAdapter 寫回資料庫,則不會有此問題,
因各個頁面的 Code-Behind 可直接捉得到,該個 DataSet 或 DataTable 的名稱。

這也是一般 ado.net 書籍都沒提到的。
作者 : samson_yu(蛙蛙彥)
[ 貼文 35 | 人氣 137 | 評價 40 | 評價/貼文 1.14 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/7/4 上午 10:26:32
請頁面傳object array,假設傳 object[] objCustomer
再用

DataRow datarow=datatable.LoadDataRow(objCustomer, true);
datarow.SetAdded();
adapter.InsertCommand = builder.GetInsertCommand(true);
adapter.Update(datatable.Select());

應該就可以了!!
作者 : sryang(貓老大) 貼文超過200則
[ 貼文 230 | 人氣 68 | 評價 680 | 評價/貼文 2.96 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/11/7 下午 11:20:36
這問題個人之前也研究過
我得出的結論,就是使用 ObjectDataSource 來連接自訂的資料存取類別(DAC)
並且 DAC 做兩層架構,底層是 BaseDAC,負責 DAC 共用的功能,例如:select、insert、update、delete、transaction 等等
上層是針對不同 table 的需要,做額外的功能擴充。
所以,要 update 哪一個 table,就是寫在上層
組 SQL 字串的工作,共用的就由 DAC base 來負責,特殊的就由 table 的 DAC 來負責

DAC 的 select 回傳,使用 List<rowObject>,這可以很好的被 ObjectDataSource 來處理
並且針對每一個 Table 定義各自的 rowObject

大概就是這樣。
 板主 : 小朱
 > ADO.NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - ADO.NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
ADO.NET
1 小朱 1520 
2 識丁 280 
3 吳馨琳 270 
4 小台 180 
5 Snaking 140 
6 mark 140 
7 好說 120 
8 ammon 100 
9 toyboy 70 
10 再見男人 50 
ADO.NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125