2

DNN 5.5.0にアップグレードした後IHydratable、すべてのビジネスオブジェクトに実装する必要がありました。

このアイデアは最初は良い方法のように思えましたが、遊んだ後はIHydratableもうよくわかりません。

2つの可能性があります:

  1. 私はそれを間違っています
  2. IHydratableselect *すべてのクエリを作成するために使用するように強制します

ビジネスケース:

  • 私の最初のsprocはとBgIdを返しますBgShortDesc
  • 2番目のsprocが返さBgIdれ、BgReportedUser

IHydratableは以下のように実装されています:

public class Bug : IHydratable
{ 
  public int BgId { get; set; }
  public string BgShortDesc { get; set; }
  public int BgReportedUser { get; set; }
  public DateTime BgReportedDate { get; set; }

  public Bug() { }

  public int KeyID
  {
    get { return BgId; }
    set { BgId = value; }
  }

  public void Fill(IDataReader dr)
  {
    BgId = Convert.ToInt32(Null.SetNull(dr["BgId"], BgId));
    BgShortDesc = Convert.ToString(Null.SetNull(dr["BgShortDesc"], BgShortDesc));
    BgReportedUser = Convert.ToInt32(Null.SetNull(dr["BgReportedUser"], BgReportedUser));
    BgReportedDate = Convert.ToDateTime(Null.SetNull(dr["BgReportedDate"], BgReportedDate));
  }
}

すべてのフィールドが。で返されるわけではないため、fillメソッドはIndexOutOfRangeException上記のsprocのいずれかにをスローしIDataReaderます。

問題を回避する簡単な方法はselect *、すべてのsprocで使用することですが、それは良い習慣ではありません。

IHydratableこのシナリオで実装する適切な方法は何ですか?

PSは、私の例は、要点を理解するために単純化しすぎていることを覚えておいてください。

4

1 に答える 1

1

私は別のフォーラムでこれに対する実行可能な答えを得ました

提案は次のとおりです。

    public void Fill(IDataReader dr)
    {
            if (dr.ColumnExists("BgId"))
            {
              BgId = Convert.ToInt32(Null.SetNull(dr["BgId"], BgId));
            }
            //do the above for all the properties
    }

編集:

SOに関するこれらの2つの回答( @JamesEggers@Chad Grant)を使用して、IDataReaderで拡張メソッドを作成することにより、これを行うためのより良い方法を見つけました。

    /// <summary>
    /// Check if the column exists in the datareader before accessing its value
    /// </summary>
    /// <param name="reader">DataReader</param>
    /// <param name="columnName">Column name</param>
    /// <returns>True if column exists, false if not</returns>
    public static bool ColumnExists(this IDataReader reader, string columnName)
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
            {
                return true;
            }
        }

        return false;
    }
于 2010-10-29T17:16:40.270 に答える