Delete via DataAdapter

這是一個慘烈的教訓,我搞了一天半.
我始終不明白,爲什麼我確實地在 DataSet 裡的 DataTable 去刪掉了一筆 DataRow, 但 Update 的時候卻無法成功?
Open source 就是有這好處,於是我開始 Trace mono 的 ByteFX.Data.
大致看了一下,發現幾件有趣的事情:
*在我們呼叫 xxxDataAdapter.Update 的時候,其實是呼叫 DbDataAdapter.Update.各個 Provider 並不負責這件事情.各個 Provider 是負責提供必要的資訊給 DbDataAdapter, 讓她去完成這件事情.
*xxxDataAdpater 的 DeleteCommand, InsertCommand, UpdateCommand 在
xxxDataAdapter da = new xxxDataAdapter(); xxxCommandBuilder xcb = new xxxCommandBuilder( da ); 的時候並不會被馬上組出來,而是在內部被呼叫 RowUpdating (真正要 Update)的時候,才被組合出來.
這些都跟主旨無關.回到正題.爲什麼無法刪除呢??
我使用的語法是這樣子,在我找到我要刪除的 DataRow 之後,我使用的是 DataTable.Rows.Remove( 我要刪除的row ).
很不幸,這會直接從 DataRowCollection 裡面直接刪掉.
但是 DbDataAdapter.Update 依賴的是 DataRowCollection 裡面各個 Row 的 RowState 來判定要新增,修改或是刪除. 如果 DataRowCollection 裡面並沒有這個 DataRow,那麼 DbDataAdapter.Update 也不會知道這個 DataRow 需要被刪除.
因此你在找到要刪除的 DataRow 之後,得用 DataRow.Delete() 才行.
這邊需要特別注意的是, Delete() 之後,不要使用 DataTable.AcceptChanges(),這個命令同樣會使得 DataRowCollection 採取和 Remove() 一樣的動作.
Delete() 之後再呼叫 xxxDataAdapter.Update(), 這樣就可以順利完成刪除動作了.

PageIndexChanged on mono 1.1.9.2

原本以為是我程序上的錯誤,但並不是.
情況是這樣的,我想要在 mono 1.1.9.2 上使用 DataGrid 的分頁功能.
因此我複寫了 PageIndexChanged 事件.
總共有 2x 筆資料, PageSize 設為 10, 因此共會出現 3 頁.
但只要我點選最後一頁,網頁就會丟出例外:
System.IndexOutOfRangeException: Array index is out of range.
搜索了一下,發現這個錯誤已經被回報了:Bug 76503,並且已經於 svn HEAD r52068 修正掉了.
可惜現在不能試.

喝酒小遊戲之二

非常接近這個小遊戲

取兩顆骰子,中間放一公杯,大家輪流骰,以點數的加總來決定加酒,減酒,喝
6 點代表回轉,本來順時鐘,則改為逆時鐘;反之亦然.
7 點代表往公杯添酒
8 點代表可以減少公杯的酒
9 點代表喝!!把公杯的酒全都喝完!!!

但是不用骰子,使用比較容易取得的撲克牌.
於是就變成翻牌的遊戲,每人輪流從牌堆中翻牌,點數代表意義相同.
以下是我的想法…
想搞刺激的話,可以把牌減少.
想多點樂趣的話,可以再爲一些特殊牌增加特殊意義,如: J 換酒 , Q 表示所有女生分掉, K 表示所有男生分掉…等等的.

關於 blog 這個分類

這裡的 blog 分類,原本只是備份公司的書籤,順便做個很簡短的介紹而已.
後來差不多都備份完了,也就沒再繼續.
看看我 bloglines 裡面的收錄,現在已經超過 300 個了…
要介紹,恐怕也介紹不完吧~~暈~~
我妹前一陣子老是問我,怎麼可能看的完.
是啊,從超過 200 開始,我幾乎沒看完過.
每天採取的策略都是,把所有超過 N 篇的 blog 看完就好,新聞就大致掃過.
當然,這就流於走馬看花,但我是覺得這樣的效率還不錯.
總而言之,blog這個分類文章,就到此為止了.
想知道我又收了啥 blog, 就到這裡看吧…