首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDataReader.GetOrdinal或IDataReader[ColumnName]

IDataReader.GetOrdinal或IDataReader[ColumnName]
EN

Stack Overflow用户
提问于 2012-02-16 18:50:40
回答 3查看 2.7K关注 0票数 3

我有两种情况可以从IDataReader对象中提取信息

大小写-1-长度,计算序数,然后解析字符串。

代码语言:javascript
复制
public static string GetString(IDataReader rdr, string columnName)
{
    int ordinal = rdr.GetOrdinal(columnName);
    if (rdr.IsDBNull(ordinal))
    {
        return string.Empty;
    }
    return (string)rdr[ordinal];
}

例2,短程,不需要计算序数就能得到数据。

代码语言:javascript
复制
public static string GetString(IDataReader rdr, string columnName)
{
    return (string)rdr[columnName];
}

哪一种技术应该是首选的,以及为什么和如果有任何特定的背景?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-16 18:59:57

SqlDataReader's this[string name]看起来像:

代码语言:javascript
复制
public override object this[string name]
{
    get
    {
        return this.GetValue(this.GetOrdinal(name));
    }
}

因此,它计算序数内部,并且没有什么不同的方式使用。

更新

Yo可以将您的代码重写为:

代码语言:javascript
复制
public static string GetString(IDataReader rdr, string columnName)
{
    return (rdr[columnName] as String)??String.Empty;
}
票数 4
EN

Stack Overflow用户

发布于 2012-02-16 19:58:34

下面为第一个方法提供了多少东西:

代码语言:javascript
复制
.method public hidebysig static string  GetString(class [System.Data]System.Data.IDataReader rdr,
                                                  string columnName) cil managed
{
  // Code size       49 (0x31)
  .maxstack  2
  .locals init ([0] int32 ordinal,
           [1] string CS$1$0000,
           [2] bool CS$4$0001)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  callvirt   instance int32 [System.Data]System.Data.IDataRecord::GetOrdinal(string)
  IL_0008:  stloc.0
  IL_0009:  ldarg.0
  IL_000a:  ldloc.0
  IL_000b:  callvirt   instance bool [System.Data]System.Data.IDataRecord::IsDBNull(int32)
  IL_0010:  ldc.i4.0
  IL_0011:  ceq
  IL_0013:  stloc.2
  IL_0014:  ldloc.2
  IL_0015:  brtrue.s   IL_0020
  IL_0017:  nop
  IL_0018:  ldsfld     string [mscorlib]System.String::Empty
  IL_001d:  stloc.1
  IL_001e:  br.s       IL_002f
  IL_0020:  ldarg.0
  IL_0021:  ldloc.0
  IL_0022:  callvirt   instance object [System.Data]System.Data.IDataRecord::get_Item(int32)
  IL_0027:  castclass  [mscorlib]System.String
  IL_002c:  stloc.1
  IL_002d:  br.s       IL_002f
  IL_002f:  ldloc.1
  IL_0030:  ret
} // end of method Program::GetString

至于你的第二种方法:

代码语言:javascript
复制
.method public hidebysig static string  GetStringShort(class [System.Data]System.Data.IDataReader rdr,
                                                       string columnName) cil managed
{
  // Code size       18 (0x12)
  .maxstack  2
  .locals init ([0] string CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  callvirt   instance object [System.Data]System.Data.IDataRecord::get_Item(string)
  IL_0008:  castclass  [mscorlib]System.String
  IL_000d:  stloc.0
  IL_000e:  br.s       IL_0010
  IL_0010:  ldloc.0
  IL_0011:  ret
} // end of method Program::GetStringShort

所以方法肯定是不一样的。至于哪个更好,你没有说为什么要计算序数,所以很难说哪个对你的情况更好。

票数 2
EN

Stack Overflow用户

发布于 2012-02-16 18:53:33

我不认为这真的有什么区别(他们做同样的事情),第二个似乎更容易读懂,因为引入“索引”对那些不知道读者是如何工作的人来说是很混乱的。隐藏不必要的复杂性,我说。您应该更进一步,使它成为您可以在任何地方使用的泛型,如下所示:

代码语言:javascript
复制
    private static T FromDbValue<T>(IDataReader rdr, string columnName)
    {
        var value = rdr[columnName];

        if (value == DBNull.Value)
        {
            return default(T);
        }

        return (T)value;
    }

调用它很容易:

代码语言:javascript
复制
var someString = FromDbValue<string>(rdr, "CustomerName");

编辑:您没有在第二个示例中检查DBNull,因此强制转换将在空值上失败。然而,一般来说,这两种方法是相同的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9317251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档