Mein Code ist wie folgt
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;
}
Erstes Lesen ist in Ordnung. Das zweite Lesen von FSubsystem gibt mir die Ausnahme "Jedes Gitter kann nur einmal durchlaufen werden". Was ist hier falsch? Wenn ich es in der öffentlichen IEnumerable Read () - Methode während der zweiten gelesenen konsumierten Eigenschaft nachverfolgte, ist dies wahr. Wie kann ich das überwinden?
Der zugrunde liegende Datenleser ist ein Forward-Only-Gerät; Indem Sie Read
ein zweites Mal aufrufen, bewegen Sie den Leser vorwärts zum nächsten Raster . Sie sollten jedes Gitter nur vorwärts verwenden. Zum Beispiel könnten Sie die Anweisungen neu ordnen:
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);
}
Oder du könntest puffern:
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);
}
Ich habe gerade ein ähnliches Problem durchgemacht. Mine ist Postgresql anstelle von SQL Server, aber ich denke, dass es in diesem Fall keine Rolle spielt.
Das Hinzufügen einer ToList () am Ende des Ergebnisses hat den Trick gemacht. Hoffe, es funktioniert auch für dich.
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();