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"];

问题是仍然有方法以比这两种方法更有效的方式转换这些数据,如果没有可能的方法,您更喜欢使用这两种方法中的哪一种。在此先感谢所有帮助和建议都被接受:)

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! 动态地这样做),然后我不担心其余的部分 :)

对于一个项目,根据这篇文章,我什至不用担心序数:这是一个完全不同的用例,“昂贵”的部分是与数据库通信。

快乐编码。

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

您可以使用上述方法将对象转换为任何基本数据类型,如下所示。
转换为日期时间

    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-通用方法.aspx

于 2013-07-30T13:27:29.467 回答