3

在我們的組織中,我們正在維護一個VS 2005網站,嚴重依賴於強類型tableadapters和數據表。不用說,這是有很多原因可維護性噩夢:如何擺脫強類型tableadapters和數據表

  • 要生成我們需要連接到MSSQL2005少數據庫新表適配器和因爲我們提升我們的數據庫MSSQL2008這真是地獄。
  • 我們到了2010年底,我們真的很喜歡在這個項目中使用VS2010,但升級它無法編譯得很糟糕。我想我們可以努力實現這一目標,但我們寧願一起擺脫這種可怕的技術。
  • 生成的代碼很龐大,看起來很糟糕,我懷疑沒有LSD之類的東西,任何人都可以理解它。

在這一點上,我們真的希望做到最低限度幫助我們擺脫這些表適配器,因爲我們沒有時間,並且由於它「有效」而不是管理優先級。所以建議nHibernate是一場我們不可能發生的革命。

預先感謝您。

+2

上市,我不能提供任何幫助。我一直在那裏做(從頭開始)。我只想說我喜歡這個問題。 ADO.NET的類型化數據集從表面看起來很棒,但從長遠來看卻是一個真正的PITA。 – Tergiver 2010-11-08 16:41:10

+0

我設法建立一個完整的asp.net應用程序基於類型的數據集*和*與oracle和sql server一起工作。談論一個集羣! – 2010-11-11 04:11:18

回答

2

我有一個與許多強類型的數據集和TableAdapters的VS 2005解決方案。幾年前,我將它升級到了VS 2008,沒有遇到任何重大問題,並且我最近將其升級到了2010年,沒有出現任何重大問題。在2010年升級之後,我確實遇到了一些問題,使得我的列屬性發生了變化,所以我決定不打開任何DataSets,除非我必須進行更改。

我的建議是嘗試升級到2008,然後再升級到2010年。如果失敗了,也許它的時間來重構你的DAL ...

+0

謝謝。升級到VS2010時,我收到了很多編譯錯誤,因爲生成的方法簽名不同。我真的想重構DAL,但是我沒有看到清楚的方法來做到這一點,因爲我無法測試我的更改。 – duraid 2010-11-09 18:36:33

1

德盧西亞,

我不知道的你所尋找的答案/解決方案,因爲一方面你說你很大程度上依賴於鍵入的數據集,但是你想擺脫它們。 :)

因此,我會嘗試通過提供我過去使用的解決方案來回答你的問題,所以在這裏。

/// <summary> 
///This class is a wrapper around a DataTable, 
///Associated with the stored procedure - usp_GET_FEATURES 
///This class provides a strongly typed interface to access data from the DataTable 
///containing the result of the given stored procedure. 
/// </summary> 
public class FeaturesDtw : BaseDataTableWrapper 
{ 
    public Int32 Id { get { return (Int32)DataRow[0]; } } 
    public String Title { get { return (String)DataRow[1]; } } 
    public String ShortDesc { get { return (String)DataRow[2]; } } 
    public String Description { get { return (String)DataRow[3]; } } 
    public String ImageFilePath { get { if (DataRow[4] != DBNull.Value) return (String)DataRow[4]; else return default(String); } } 
    public String ImageFileName { get { if (DataRow[5] != DBNull.Value) return (String)DataRow[5]; else return default(String); } } 
    public String ImageMimeType { get { if (DataRow[6] != DBNull.Value) return (String)DataRow[6]; else return default(String); } } 
    public DateTime DateCreated { get { return (DateTime)DataRow[7]; } } 

    public FeaturesDtw() 
     :base() 
    { 
    } 

    public FeaturesDtw(DataRow row) 
     :base(row) 
    { 
    } 
} 

您在上面看到的類就是我所說的DataTable包裝器。從本質上講,它使您能夠以強類型的方式使用DataTable,因爲該類是一個自動生成的類,它的字段直接映射到數據庫中的表或stroed過程。

您可以通過以下方式之一使用它:

var dt = DataModule.GetFeaturesDataSet().Tables[0]; 
    FeatureDtw featureDtw = new FeatureDtw(); 
    foreach(DataRow row in dt.Rows) 
    { 
    featureDtw.DataRow = row; 
    var id = featureDtw.Id; 
    var title = featureDtw.Title; 
    } 

在上面的代碼,我從我的DAL得到DataTab(變量DT),然後我用包裝上,以獲得在該領域強類型的方式。

OR

private IEnumerable<T> GetEnumerableDtw<T>(DataTable dt) where T : BaseDataTableWrapper, new() 
{ 
    foreach (DataRow row in dt.Rows) 
    { 
    var baseDataTableWrapper = new T(); 
    baseDataTableWrapper.DataRow = row; 
    yield return baseDataTableWrapper; 
    } 
} 

可以dt變量,通過上述方法,並取回一個IEnumerable,您可以使用它像任何正常的IEnumerable,除了數據確實來自一個DataTable的到來。

在這兩種情況下,它都是強類型的。當然,在這兩種情況下都假設您不打算使用DataTable將數據發回,而只是將數據提取出來。

希望有道理嗎?

基類如下

/// <summary> 
///This class Base Class for all DataTable Wrappers 
/// </summary> 
public class BaseDataTableWrapper 
{ 
    public DataRow DataRow { get; set; } 

    public BaseDataTableWrapper() 
    { 
    } 

    public BaseDataTableWrapper(DataRow row) 
     :this() 
    { 
     DataRow = row; 
    } 
} 
+0

該問題與生成的強類型數據集和數據表(以及數據表適配器)有關。所以,他不需要一種新的方法來製作一個強類型的數據表,而是用更好的東西替換它們。 – 2010-11-11 04:16:27