我的代码如下
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 :(得分: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();