精巧错误:每个网格只能迭代一次

时间:2012-12-11 19:36:11

标签: dapper

我的代码如下

   try
        {
            SqlConnection mapperConnection = SqlAccessHelper.SqlHelper.GetOpenConnection(SqlConnectionHelper.SqlConnectionString());
            var parameters = new DynamicParameters();
            parameters.Add("@P_MarketId", marketId, DbType.Int32);
            parameters.Add("@P_Output", dbType: DbType.Int32, direction: ParameterDirection.Output);

            using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords", parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
            {
                    IEnumerable<MarketRecord.FItem> FItem = multi.Read<MarketRecord.FItem>();                        
                    IEnumerable<MarketRecord.FSubsystem> FSubsystem = multi.Read<MarketRecord.FSubsystem>();
                    objCResponseVO.addObject("FItem",FItem);
                    objCResponseVO.addObject("FSubsystem",FSubsystem);
            }
        }
        catch (Exception ex) {
            throw ex;
        }

第一次阅读就好了。第二次读取FSubsystem给我一个例外“每个网格只能迭代一次”。什么错了? 当我在公共IEnumerable Read()方法中追踪它时,第二次读取消耗属性为true。我怎么能克服这个。?

2 个答案:

答案 0 :(得分:5)

底层数据阅读器是仅前向设备;通过第二次调用Read,您将阅读器向前移动到下一个网格。您应该以仅向前的方式使用每个网格。例如,您可以重新排序语句:

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords",
    parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
{
        IEnumerable<MarketRecord.FItem> FItem =
            multi.Read<MarketRecord.FItem>();                        
        objCResponseVO.addObject("FItem",FItem);

        IEnumerable<MarketRecord.FSubsystem> FSubsystem =
            multi.Read<MarketRecord.FSubsystem>();            
        objCResponseVO.addObject("FSubsystem",FSubsystem);
}

或者你可以缓冲:

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords",
    parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
{
        IEnumerable<MarketRecord.FItem> FItem =
            multi.Read<MarketRecord.FItem>().ToList();
        IEnumerable<MarketRecord.FSubsystem> FSubsystem =
            multi.Read<MarketRecord.FSubsystem>().ToList();
        objCResponseVO.addObject("FItem",FItem);
        objCResponseVO.addObject("FSubsystem",FSubsystem);
}

答案 1 :(得分:1)

我刚刚经历过类似的问题。我的是Postgresql而不是SQL Server,但我认为这种情况并不重要。

在结果的末尾添加ToList()就可以了。希望它也适合你。

            string sql = @"
                    select * from usuario where id=@id;

                    select  idarea 
                    from    areausuario
                    where   idusuario = @id;

                    select * from area;
                    ";


        var res = this.Connection.QueryMultiple(sql, p);

        var usuarioData = res.Read<Entities.Usuario>().First();
        var areasSelected = res.Read<int>().ToList();
        var areas = res.Read<Entities.CatalogoPadreSelection>().ToList();
相关问题