【问题标题】:How to get rid of strongly typed tableadapters and datatables如何摆脱强类型表适配器和数据表
【发布时间】:2010-11-08 15:44:04
【问题描述】:

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

  • 要生成新的表适配器,我们需要连接到 MSSQL2005 和更少的数据库,并且由于我们将数据库升级到 MSSQL2008,这真是地狱。
  • 我们在 2010 年底,我们非常喜欢在这个项目中使用 VS2010,但是升级它却编译失败。我想我们可以努力让它发挥作用,但我们宁愿一起摆脱这种糟糕的技术。
  • 生成的代码很大而且看起来很糟糕,我怀疑没有像 LSD 这样的东西任何人都能理解它。

在这一点上,我们真的很想做最少的事情来帮助我们摆脱这些表格适配器,因为我们没有时间,而且它不是管理的优先事项,因为它“有效”。因此,建议 nHibernate 是一场我们可能不会随之而来的革命。

提前谢谢你。

【问题讨论】:

  • 我无法提供任何帮助。我去过那里并做到了(从头开始)。我只是想说我喜欢这个问题。 ADO.NET 的类型化数据集表面上看起来很棒,但从长远来看是真正的 PITA。
  • 我设法基于类型化数据集构建了一个完整的 asp.net 应用程序并且同时使用了 oracle 和 sql server。谈论一个集群!

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


【解决方案1】:

我有一个 VS 2005 解决方案,其中包含许多强类型数据集和 TableAdapter。几年前我将它升级到 VS 2008 没有任何重大问题,我最近将它升级到 2010 没有任何重大问题。在 2010 年升级后,我确实在让我的列属性更改保持不变时遇到了一些问题,所以我采取了不打开任何数据集的方法,除非我绝对必须进行更改。

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

【讨论】:

  • 谢谢。升级到 VS2010 时出现很多编译错误,因为生成的方法签名不同。我真的很想重构 DAL,但我看不到如何做到这一点的明确方法,因为我无法测试我的更改。
【解决方案2】:

德鲁西亚,

我不确定您正在寻找哪种答案/解决方案,因为一方面您说您严重依赖类型化的数据集,但随后又想摆脱它们。 :)

因此,我将尝试通过提供我过去使用过的解决方案来回答您的问题,所以就这样吧。

    /// <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),然后使用包装器以强类型方式获取字段。

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

【讨论】:

  • 该问题与生成的强类型数据集和数据表(以及数据表适配器)有关。因此,他不需要一种新的方法来制作强类型数据表,而是用更好的方法来替换它们。
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 2016-08-01
  • 2013-03-09
  • 2017-07-16
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多