1

私はデータリーダーを使用してデータベースからデータをフェッチするコードを作成するように任命されました。デフォルトでフェッチされるデータリーダーからデータを変換するために以下で使用できる3つの方法のベストプラクティスがどうなるか知りたいです。オブジェクトのタイプ。

    internal static RoomType SelectRoomType(int roomTypeID)
    {
        SqlCommand commRoomTypeSelector = ConnectionManager.MainConnection.CreateCommand();
        commRoomTypeSelector.CommandType = CommandType.StoredProcedure;
        commRoomTypeSelector.CommandText = "Rooms.asp_RMS_RoomType_Select";
        commRoomTypeSelector.Parameters.AddWithValue("RoomTypeID", roomTypeID);

        SqlDataReader dreadRoomType = commRoomTypeSelector.ExecuteReader();
        if (dreadRoomType.FieldCount != 0)
        {
            dreadRoomType.Read();
            RoomType roomType = new RoomType();
            roomType.RoomTypeID = (int)dreadRoomType["RoomTypeID"];
            roomType.RoomTypeName = (string)dreadRoomType["RoomType"];
            roomType.IsActive = ((string)dreadRoomType["IsActive"]).ToUpper() == "Y";
            roomType.LastEditDate = (string)dreadRoomType["LastEditDate"] != string.Empty ? DateTime.Parse((string)dreadRoomType["LastEditDate"]) : DateTime.MinValue;
            roomType.LastEditUser = (string)dreadRoomType["LastEditUser"];
            dreadRoomType.Close();
            return roomType;
        }
        dreadRoomType.Close();
        return null;
    }

ここで私を混乱させるのは、開封の部分です。http://msdn.microsoft.com/en-us/library/yz2be5wk.aspxによる 、開封と開封は非常に費用がかかるため、避ける必要があります。私は私が使うことができることを知っています

   int.Parse(dreadRoomType["RoomTypeID"].ToString())

それ以外の

   roomType.RoomTypeID = (int)dreadRoomType["RoomTypeID"];

問題は、このオプションの両方よりもはるかに効率的な方法でこのデータを変換する方法がまだあることと、2つの方法のどちらを使用するかを選択できる方法がない場合です。事前に感謝しますすべてのヘルプと提案が受け入れられます:)

4

5 に答える 5

3

を使用SqlDataReader.GetInt32()して、再度変換/解析する必要をなくすことができますint。これには、選択した列内の整数がどのインデックスにあるかを知る必要があります。

roomType.RoomTypeID = dreadRoomType.GetInt32(0);
于 2011-11-09T03:19:24.053 に答える
3

ボクシングはそれほど高価 ではありません。

他の選択肢は役に立ちません。を取得するとobject、すでにボックス化されています。
特に文字列の解析は、ボクシングよりもおそらくはるかに高価です。(私は測定していませんが)

型付きAPIが存在する場合は、それを使用してボクシングを回避できます(呼び出しGetInt32など)。
(ただし、これらの型付きメソッドは、型なしメソッドの単なるラッパーであるため、ボックス化されることもあります)


結論:心配しないでください

そのガイドラインは、可能な場合は型付き(ジェネリック)コレクションを使用して、そもそもボクシングを避けるように指示しています。

于 2011-11-09T03:21:09.293 に答える
2

ボクシング/アンボクシングが「遅い」場合(実際にはそうではありません)...文字列への変換とその逆の変換がそれほど遅くないのはなぜですか?(それは本当に無駄です:ボクシング/アンボクシングは非常に高速です。)しかし、心配する前に、まずパフォーマンスの問題があることを確認します...

私の経験では、一度に読み込まれる数千のアイテムを含むデータの場合、列インデックスを事前に決定することで(ただし、動的に!を使用して)パフォーマンスを大幅に向上できることがGetOrdinalわかりました。その後、心配する必要はありません。残り :)

1つの項目については、この投稿によると、私は序数についてさえ心配しません。それはまったく異なるユースケースであり、「高価な」部分はデータベースと通信しています。

ハッピーコーディング。

于 2011-11-09T03:24:45.890 に答える
1

ボックス化とアンボックス化は、文字列を解析してintを抽出するほど高価ではありません。時期尚早の最適化を行う前にプロファイルを作成してください。

于 2011-11-09T03:24:45.540 に答える
0
    private static void GetValue<T>(object o, ref T defaultValue)
    {
        try
        {
            if (defaultValue == null)
            {
                throw new Exception("Default value cannot be null");
            }
            else if (o != null)
            {
                if ((o is T))
                {
                    defaultValue = (T)o;
                }
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

上記のメソッドを使用して、次のようにオブジェクトを任意の基本データ型に変換できます。
dateTimeに変換

    public static DateTime GetDateTime(object o, DateTime defaultValue)
    {
        try
        {
            GetValue<DateTime>(o, ref defaultValue);
            return defaultValue;
        }
        catch (Exception)
        {
            throw;
        }
    }

整数に変換

    public static int GetInteger(object o, int defaultValue)
    {
        try
        {
            GetValue<int>(o, ref defaultValue);
            return defaultValue;
        }
        catch (Exception)
        {
            throw;
        }
    }

ここですべての基本的なデータ型を含む完全なコードを参照してダウンロードします http://www.dotnetlines.com/Blogs/tabid/85/EntryId/39/Convert-Object-type-in​​to-its-specific- data-type-using- a-Generic-Method.aspx

于 2013-07-30T13:27:29.467 に答える