強類型的DataSet可以幫助我們快速的建立數據訪問層,它的簡易性使得我們可以在小的項目中廣泛的 使用它。但是它也有一些小的缺陷,這裡和大家共同討論下它到底有哪些缺陷,以及我們怎麼去避免這些 問題。
1) 在一個query中,它只支持對本表的操作,不支持對多表的操作。在這種情況下,我們可以自己寫 一個stored procedure,然後新建一個TableAdapter,這樣它便會幫我們生成一個新的邏輯實體表,表內 存儲的是stored procedure中返回的列。
2) 數據庫端的任何改動都不會自動update到強類型的DataSet. 這個功能可能會在以後的版本中得到 解決,在ORCAS中,強類型DataSet和LINQ仍然都沒有實現自動更新schema的功能。既然它不能自動更新 schema,我們只能手動刪除這個表然後重新添加這個表(手動改字段的屬性也可以,但是容易造成錯誤)。 這樣的話所有寫的query都將會丟失。為了避免這樣的情況,我們可以將所有的query寫成存儲過程,這樣 即使在表刪除的情況下,我們仍然可以輕松再添加一遍。
3) 強類型的DataSet在獲取存儲過程的返回值(e.g. return 1)方面有點問題。我們不能方便的像函數 一樣得到 int returnValue = (int) da.CallSP(); 為了得到它的返回值,我們需要實現一個生成的 TableAdapter的partial類,然後加上這個自定義的方法:
Code
partial class UsersTableAdapter { public object GetReturnValue(int commandIndex) { return this.CommandCollection[commandIndex].Parameters[0].Value; } }
這個commandIndex的值就是你的方法所在的index,如下示例中index是1(index是從0開始算起):
現在我們便可通過如下代碼來得到返回值:
Code
da.CallSP(xx, xx); int returnValue = int.Parse(da.GetReturnValue(2).ToString());
當然,在ORCAS中,我們也有更好的選擇,那就是用LINQ-SQL。它是.NET的一個ORM工具,它可以通過 LINQ query自動為你生成SQL腳本,讓你更加快速的建立數據訪問層,所支持的功能更加的強大。不過 在.NET Framework 3.5 SP1中,它將被LINQ-Entity所替代。