转换SqlDataReaders

时间:2008-12-29 19:57:30

标签: c# .net sql sqldatareader

(int)reader[0]替换为reader.GetInt32(0)有什么好处?我确信这样的投射功能是有原因的,但除了感觉更美观以至于避免演员本人之外,我不确定这些原因是什么。

3 个答案:

答案 0 :(得分:5)

在代码....

        void OneWay()
        {
            System.Data.SqlClient.SqlDataReader reader = null;
            int i = reader.GetInt32(0);
        }

        void OtherWay()
        {
            System.Data.SqlClient.SqlDataReader reader = null;
            int i = (int)reader[0];
        }

在IL

.method private hidebysig instance void OneWay() cil managed
{
    .maxstack 2
    .locals init (
        [0] class [System.Data]System.Data.SqlClient.SqlDataReader reader,
        [1] int32 i)
    L_0000: nop 
    L_0001: ldnull 
    L_0002: stloc.0 
    L_0003: ldloc.0 
    L_0004: ldc.i4.0 
    L_0005: callvirt instance int32 [System.Data]System.Data.Common.DbDataReader::GetInt32(int32)
    L_000a: stloc.1 
    L_000b: ret 
}


.method private hidebysig instance void OtherWay() cil managed
{
    .maxstack 2
    .locals init (
        [0] class [System.Data]System.Data.SqlClient.SqlDataReader reader,
        [1] int32 i)
    L_0000: nop 
    L_0001: ldnull 
    L_0002: stloc.0 
    L_0003: ldloc.0 
    L_0004: ldc.i4.0 
    L_0005: callvirt instance object [System.Data]System.Data.Common.DbDataReader::get_Item(int32)
    L_000a: unbox.any int32
    L_000f: stloc.1 
    L_0010: ret 
}

所以,IL是不同的,但我怀疑它们之间有任何明显的区别。也许经过一百万次迭代后你会看到差异,但不太可能。

答案 1 :(得分:1)

前者也可以接受列名作为字符串而不是索引,并尝试将列值转换为int。后者只接受索引,不会执行任何转换。

答案 2 :(得分:1)

reader [0]返回一个System.Object,(int)reader [0]实际上正在从Object转换为Int32。

如果您调用GetXXX(0)方法,则不会执行任何转换。因此,从流中检索的数据必须已经是方法指定的类型。

如果检索到的数据类型不匹配或列有DBNull,则会抛出InvalidCastException。