两次迭代DataReader

3

我需要在 DataReader 中进行两次迭代。有没有一种方法可以在不使用 DataSets 和不运行两次查询的情况下完成此操作?顺便说一下,我正在使用 C#。
谢谢


你为什么要避免使用DataSets呢?如果是性能问题,你可以考虑使用DataRow对象上的ItemArray。与使用列索引器相比,使用它可能会更快。 - Matthew Whited
这是几十万行数据。我会调查一下,谢谢! - Pascal
6个回答

4
简短的回答是否定的,你只需枚举结果集,然后就完成了。应该做的是将结果转储到某种简化的原始结果中,您可以无限迭代它们(避免使用DataSet时的开销)。
如果你看一下MSDN,它指出SqlDataReader是“仅向前”的,这再次表明这是不可能的。

我知道它是只能向前的...我只是想有什么办法可以绕过它,但还是谢谢! - Pascal

4

这是一个只能向前读取的阅读器,无法后退。最好的方法是在一次迭代中执行您想要执行的两个操作,而不是迭代两次数据阅读器。

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


3

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


0

我有一种解决这个问题的方法,可能不是最好的,但我已经多次使用它而没有问题。 您可以在选择子句中创建一个子查询来生成将返回多少行。 例如:

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

这与问题有什么关系? - Tab Alleman

0

IDataReader 规范不允许重置列表,但是请检查特定的实现是否还实现了 IEnumerator 或者是否有一个 GetEnumerator() 函数,因为该接口中包含了 Reset 命令。


如果Reset方法在该类上起作用,而不仅仅是抛出“NotImplementedException”异常,那么它很可能会重新查询数据库。 - Matthew Whited

0
游戏晚期,但这里有一些代码可以帮助迭代数据集。为了回答问题,这不是一个数据读取器,而是一个数据集,正如一些人建议的那样。我只迭代一次,但你可以迭代数据集两次,或者任意多次 :) 干杯

...

        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;
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接