通过DataReader迭代两次

时间:2010-07-08 20:28:00

标签: .net datareader

我需要通过DataReader迭代两次。有没有办法在不使用DataSet但不运行查询两次的情况下执行此操作?顺便说一句,我正在使用C# 感谢

6 个答案:

答案 0 :(得分:3)

简短的回答是否定的,你运行结果集的枚举,然后你就完成了。应该做的是将结果转储到某种简化的原始结果,您可以根据需要进行迭代(避免DataSet的开销)。

如果你看一下MSDN,它会注意到SqlDataReader是“仅向前”,这再次暗示这是不可能的。

答案 1 :(得分:3)

它是一个前卫的读者,你不能回去。最好的办法是,不要迭代两次数据读取器,而是在一次迭代中完成两个操作。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

IDataReader规范不允许重置列表,但检查具体实现是否也实现IEnumerator或具有GetEnumerator()函数,还有一个Reset命令作为该接口的一部分

答案 4 :(得分: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;

答案 5 :(得分: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;
            }
        }
    }
}