3

私たちの組織では、強く型付けされたテーブルアダプターとデータテーブルに大きく依存する VS 2005 Web サイトを維持しています。言うまでもなく、多くの理由から保守性の悪夢です。

  • 新しいテーブル アダプターを生成するには、MSSQL2005 以下のデータベースに接続する必要があります。データベースを MSSQL2008 にアップグレードしたため、これは本当に大変なことです。
  • 私たちは2010年の終わりにいて、このプロジェクトにVS2010を使用したいと思っていますが、アップグレードするとコンパイルに失敗します。私たちはこれを機能させるために取り組むことができると思いますが、むしろこの恐ろしい技術をまとめて取り除きたいと考えています.
  • 生成されたコードは巨大で見栄えが悪く、LSD のようなものなしでは誰も理解できないと思います。

この時点で、これらのテーブルアダプターを取り除くために最低限のことをしたいと思っています。時間がなく、「機能する」ため、管理の優先度が低いからです。したがって、nHibernate が革命であると示唆することは、おそらく実現しないでしょう。

前もって感謝します。

4

2 に答える 2

2

多くの強く型付けされた DataSet と TableAdapter を備えた VS 2005 ソリューションがありました。数年前にVS 2008にアップグレードしましたが、大きな問題はありませんでした。最近、大きな問題なく2010にアップグレードしました。2010 のアップグレード後、列のプロパティの変更を保持するのにいくつか問題があったため、絶対に変更する必要がない限り、DataSet を開かないようにしました。

私のアドバイスは、最初に 2008 にアップグレードしてから 2010 にアップグレードすることです。それが失敗した場合は、おそらく DAL をリファクタリングする時期です ...

于 2010-11-09T17:36:41.537 に答える
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 を操作する機能が提供されます。

次のいずれかの方法で使用できます。

  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;
    }
}
于 2010-11-09T23:18:26.283 に答える