【问题标题】:ADO.NET - What is best practice for getting datareader values?ADO.NET - 获取数据读取器值的最佳实践是什么?
【发布时间】:2009-02-13 10:34:22
【问题描述】:

只是想知道获取数据读取器值的最佳做法是什么。例如:

我一直在这样做:

MyValue = Dr("ColumnName")

但是已经注意到其他人在这样做:

MyValue = Dr.GetString("ColumnName")

我很想知道第二种方法的好处

【问题讨论】:

    标签: .net ado


    【解决方案1】:

    只有知道列的索引时才能使用 DbDataReader.GetString(int) 方法。使用 DbDataReader.GetString("ColumnName") 是不可能的,因为没有这样的重载。 IE。您有以下两种选择:

     string myValue1 = (string) Dr["ColumnName"];
     string myValue2 = Dr.GetString(columIndex);
    

    第一行内部调用 DbDataReader.GetOrdinal("ColumnName")。

    【讨论】:

      【解决方案2】:

      一段时间以来,我一直在使用一个包装器,它可以很好地完成类似的事情。

      RowHelper helper = new RowHelper(Dr); MyValue = helper.IntColumn("ColumnName");

      这样做的好处是帮助程序将为 NULL 列返回预定义的默认值(这是可配置的)。我有所有主要 SQL 数据类型的方法。

      要回答您的问题,第二种方法有一些装箱/拆箱开销,但为典型的业务应用程序优化此方法可能会浪费您的时间。

      【讨论】:

      • 这听起来是个好帮手。它是在内部使用 Dr.Get(String/Int/etc.) 方法还是进行强制转换?
      • 最初我使用泛型并进行了强制转换,但这太混乱了,不能很好地处理 sql BIT 字段之类的东西。所以现在它是Get String, Int。如果您想要代码,我很乐意将其发送给您。
      【解决方案3】:

      我为此做了几个通用的扩展方法:

      public static class DataReaderExtensions
      {
          public static T GetValueOrNull<T>(this IDataRecord reader, string fieldName)
              where T : class
          {
              int index = reader.GetOrdinal(fieldName);
              return reader.IsDBNull(index) ? null : (T)reader.GetValue(index);
          }
      }
      

      你明白了...我也有一个GetValueOrDefault 用于值类型。

      【讨论】:

        【解决方案4】:

        DataReader 返回类型对象,因此您需要将 DataReader 中的值转换为 MyValue 在 int 情况下的任何类型

        MyValue = (int)Dr("ColumnName");
        

        MyValue = Convert.ToInt(Dr("ColumnName"));
        

        MyValue = Dr("ColumnName").ToInt();
        

        我不确定性能差异,但我认为这可以解释为微优化,除非处理非常大的数据集

        【讨论】:

          【解决方案5】:

          使用AutoMapper

          var dataReader = ... // Execute a data reader
          var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-15
            • 2013-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多