大まかなエラー:各グリッドは一度しか反復できません

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の2回目の読書では、「各グリッドは一度しか反復できません」という例外があります。ここで何が間違っていますか?私がパブリックにIEnumerable Read()メソッドを2回読み込み中にtrueにしたときに、それを追跡しました。どうすればこのことから克服できますか?

受け入れられた回答

基礎となるデータリーダは転送専用デバイスです。 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);
}

人気のある回答

私はちょうど同様の問題を通過しました。私はSQL Serverの代わりにPostgresqlですが、この場合は問題ではないと思います。

結果の最後に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();


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow