【问题标题】:Iterate twice through a DataReader通过 DataReader 迭代两次
【发布时间】:2010-07-08 20:28:00
【问题描述】:

我需要通过 DataReader 迭代两次。有没有办法在不使用 DataSet 且不运行两次查询的情况下做到这一点?顺便说一句,我正在使用 C#。
谢谢

【问题讨论】:

  • 你为什么要避免使用数据集?如果这是性能问题,您可以查看 DataRow 对象上的 ItemArray。使用它而不是使用列索引器可以更快。
  • 几十万行。我会调查一下,谢谢!

标签: .net datareader


【解决方案1】:

简短的回答是否定的,您遍历结果集的枚举,然后就完成了。可能应该做的是将结果转储为某种简化的原始结果,您可以随意迭代(避免数据集的开销)。

如果您查看MSDN,它会指出 SqlDataReader 是“仅转发”的,这再次表明这是不可能的。

【讨论】:

  • 我知道它只是向前的......我只是想可能有一些方法可以绕过它,但是谢谢!
【解决方案2】:

它是一个只进的阅读器,你不能回去。您最好的选择是,不要重复两次数据读取器,而是在一次迭代中执行您想要执行的两项操作。

你可以自己缓存结果,但这就像破坏了DataReader的目的,所以如果你需要多次使用数据,你必须选择另一种方式来访问它。

【讨论】:

    【解决方案3】:

    这是可能的,但不是那么简单,因为数据读取器在每次 Read() 调用时都会发生变化。因此,您需要将以前的值存储在某个地方以便下次访问它。在这里使用数据集并不是一个坏主意。

    【讨论】:

      【解决方案4】:

      IDataReader 规范不允许重置列表,但是请检查具体实现是否还实现了IEnumerator 或具有GetEnumerator() 功能,该接口中有一个重置命令。

      【讨论】:

      • 如果 Reset 方法适用于该类并且不只是抛出 NotImplementedException 它很可能会重新查询数据库。
      【解决方案5】:

      我有一个解决这个问题的方法,这可能不是最好的,但我用了很多次都没有问题。 您可以在选择子句中创建一个子查询,该子查询将产生将返回的行数。 示例:

      SELECT productid, 
        name, 
        price, 
        (SELECT COUNT(*) FROM tblProduct WHERE categoryid=1 AND price <= 1000) 
           AS 'RowCount' 
      FROM tblProduct 
      WHERE categoryid=1 AND price <= 1000;
      

      【讨论】:

      • 这和问题有什么关系?
      【解决方案6】:

      在游戏后期,但这里有一些代码可以帮助迭代数据集。 并且对于这个问题来说,这不是一个数据阅读器,而是一个数据集,而不是一些建议的数据集。我只迭代一次,但您可以迭代数据集两次,或者任意多次:) 干杯

      ...

              StringBuilder VBAstrBldr = new StringBuilder();
              List<object> objects = new List<object>();
              string destPath = string.Empty;
              string _filePath = string.Empty;
              string timestampSuffix = string.Empty;
      

      ...

          string commandTextDC = @" SELECT  [CategoryID]
                                          ,[AreaNo]
                                          ,[CategoryDesc]
                                          ,[CategoryNo]
                                          ,[CatCodeDisableDate]
                                          ,[CatCodeDeprecateDate]
                                  FROM [dbo].[Categories] ";
      

      ...

      using (var connection = new SqlConnection(_dbLogConn))
      {
          connection.Open();
          using (var tran = connection.BeginTransaction())
          {
              using (var command = new SqlCommand(commandTextDC, connection, tran))
              {
                  try
                  {
                      var adapter = new SqlDataAdapter(command);
                      DataSet thedataSet = new DataSet();
                      adapter.Fill(thedataSet);
      
                      VBAstrBldr.Clear();
      
                      foreach (DataTable table in thedataSet.Tables)
                      {
                          foreach (DataRow row in table.Rows)
                          {
                              VBAstrBldr.Append(Environment.NewLine);
                              foreach (DataColumn column in table.Columns)
                              {
                                  object item = row[column];
                                  // read column and item
                                  VBAstrBldr.Append("columnName: " + column.ColumnName.ToString() + " Value: " + item.ToString());
                                  VBAstrBldr.Append(Environment.NewLine);
                              }
                          }
                      }
      
                      _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
                      destPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "VBAwithDC" + timestampSuffix + ".txt");
      
                      using (StreamWriter sw = new StreamWriter(System.IO.File.Create(destPath)))
                      {
                          sw.Write(VBAstrBldr);
                      }
                  }
                  catch (Exception Ex)
                  {
                      string msg = Ex.Message.ToString();
                      tran.Rollback();
                      throw;
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-26
        • 2017-09-21
        • 1970-01-01
        • 2021-10-05
        • 2023-04-02
        • 2016-09-01
        • 2014-02-12
        • 2011-08-31
        相关资源
        最近更新 更多