2012-12-11 64 views
4

我的代碼如下小巧玲瓏的錯誤:一旦

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。我怎麼能克服這一點?

+0

可能是有益的,看看你的存儲過程是什麼樣子。 –

+0

我的SP只有2個選擇查詢。 –

回答

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); 
} 
+0

重新排序沒有工作。只要我寫IEnumerable FItem = multi.Read (); IEnumerable FSubsystem = multi.Read (); 也沒有工作。然而第二個選項工作正常。我可以知道爲什麼嗎? –

+0

但轉換爲tolist會消耗一些時間。直接綁定到相同的類對象。 –

+0

@KuntadyNithesh你能定義「沒有工作」嗎? –

1

我剛剛通過類似的問題。我的是Postgresql而不是SQL Server,但我認爲這種情況並不重要。

在結果的末尾添加一個ToList()就有訣竅。希望它也適合你。

  string sql = @" 
        select * from usuario where [email protected]; 

        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();