如何摆脱强类型tableadapters和数据表

时间:2010-11-08 15:44:04

标签: visual-studio-2008 datatable visual-studio-2005 tableadapter maintainability

在我们的组织中,我们正在维护一个VS 2005网站,该网站严重依赖于强类型的tableadapter和数据表。毋庸置疑,这是一个可维护性的噩梦,原因有很多:

  • 要生成新的表适配器,我们需要连接到MSSQL2005和更少的数据库,因为我们将数据库升级到MSSQL2008,这真的很糟糕。
  • 我们在2010年底,我们真的很喜欢将VS2010用于这个项目,但是升级它无法编译得很糟糕。我想我们可以努力让它发挥作用,但我们宁愿一起摆脱这种可怕的技术。
  • 生成的代码很庞大,看起来很糟糕,我怀疑没有像LSD这样的东西可以理解它。

在这一点上,我们真的想做最小的工作来帮助我们摆脱这些桌面适应器,因为我们没有时间,而且它不是管理层的优先考虑因为它“有效”。因此,建议nHibernate是一场我们不会发生的革命。

提前谢谢你。

2 个答案:

答案 0 :(得分:2)

我有一个带有许多强类型DataSet和TableAdapter的VS 2005解决方案。几年前我将它升级到VS 2008而没有任何重大问题,我最近刚刚将其升级到2010而没有任何重大问题。我确实在2010年升级后让我的列属性更改坚持了一些问题,所以除非我必须进行更改,否则我不会打开任何DataSet。

我的建议是首先尝试升级到2008,然后再升级到2010年。如果失败了,也许是时候重构你的DAL ......

答案 1 :(得分: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 proc。

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

  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;
    }
}