.net 在数据读取器中迭代两次

.net 在数据读取器中迭代两次,.net,datareader,.net,Datareader,我需要在DataReader中迭代两次。有没有一种方法可以在不使用数据集和不运行两次查询的情况下做到这一点?顺便说一下,我用的是C。 谢谢简短的回答是“否”,您完成了结果集的枚举,然后就完成了。可能应该做的是将结果转储到某种简化的原始结果中,您可以尽可能多地迭代这些结果,从而避免数据集的开销 如果您看一看,它会注意到SqlDataReader只是向前的,这将再次表明这是不可能的。IDataReader规范不允许重置列表,但是,检查具体实现是否也实现了IEnumerator或具有GetEnumer

我需要在DataReader中迭代两次。有没有一种方法可以在不使用数据集和不运行两次查询的情况下做到这一点?顺便说一下,我用的是C。
谢谢

简短的回答是“否”,您完成了结果集的枚举,然后就完成了。可能应该做的是将结果转储到某种简化的原始结果中,您可以尽可能多地迭代这些结果,从而避免数据集的开销


如果您看一看,它会注意到SqlDataReader只是向前的,这将再次表明这是不可能的。

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

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

它是一个仅向前的读取器,您无法返回。您最好的选择是,不要对数据读取器进行两次迭代,而是在一次迭代中执行您想要执行的两个操作


您可以自己缓存结果,但这就像破坏了DataReader的用途,因此如果您需要多次将数据放在手边,您必须选择另一种方式来访问它。

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


在游戏后期,这里有一些代码可以帮助您迭代数据集。 诚然,这不是一个数据阅读器,而是一个数据集,正如一些人所建议的那样。我只迭代了一次,但是您可以在数据集中迭代两次,或者任意多次:干杯


如果Reset方法在该类上工作,并且不只是抛出NotImplementedException,那么它很可能会重新查询数据库。。。我只是想也许有办法摆脱它,但是谢谢!为什么要避免使用数据集?如果是性能问题,您可以查看DataRow对象上的ItemArray。使用它而不是使用列索引器可以快得多,它有几十万行。我会调查的,谢谢!这和这个问题有什么关系?
SELECT productid, 
  name, 
  price, 
  (SELECT COUNT(*) FROM tblProduct WHERE categoryid=1 AND price <= 1000) 
     AS 'RowCount' 
FROM tblProduct 
WHERE categoryid=1 AND price <= 1000;
        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;
            }
        }
    }
}