德盧西亞,
我不知道的你所尋找的答案/解決方案,因爲一方面你說你很大程度上依賴於鍵入的數據集,但是你想擺脫它們。 :)
因此,我會嘗試通過提供我過去使用的解決方案來回答你的問題,所以在這裏。
/// <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;
}
}
上市,我不能提供任何幫助。我一直在那裏做(從頭開始)。我只想說我喜歡這個問題。 ADO.NET的類型化數據集從表面看起來很棒,但從長遠來看卻是一個真正的PITA。 – Tergiver 2010-11-08 16:41:10
我設法建立一個完整的asp.net應用程序基於類型的數據集*和*與oracle和sql server一起工作。談論一個集羣! – 2010-11-11 04:11:18