Проблема в том, что NpgSql позволяет одновременно открывать только одно устройство чтения данных.Если вы столкнулись с ситуацией, когда вам нужно одновременно открыть более одного устройства чтения данных для одного и того же соединения, я бы сказал, что может быть лучший способ достижения вашей конечной цели.
Итак, отказ от ответственности ...не делай этогоНО, если вы хотите сделать то, что вы описали выше, это был бы способ сделать это:
cmdNumWins.Parameters.Add(new NpgsqlParameter("@selid", NpgsqlDbType.Integer));
cmdNumPlcs.Parameters.Add(new NpgsqlParameter("@selid", NpgsqlDbType.Integer));
cmdNumLosses.Parameters.Add(new NpgsqlParameter("@selid", NpgsqlDbType.Integer));
List<int> idList = new List<int>();
using (NpgsqlDataReader drGetSelectionIds = cmdGetSelectionIds.ExecuteReader())
{
while (drGetSelectionIds.Read())
idList.Add(drGetSelectionIds.GetInt32(0));
drGetSelectionIds.Close();
}
foreach (int selid in idList)
{
cmdNumWins.Parameters[0].Value = selid;
cmdNumPlcs.Parameters[0].Value = selid;
cmdNumLosses.Parameters[0].Value = selid;
numWins = Convert.ToInt32(cmdNumWins.ExecuteScalar());
numPlcs = Convert.ToInt32(cmdNumPlcs.ExecuteScalar());
numLosses = Convert.ToInt32(cmdNumLosses.ExecuteScalar());
Console.Write("selid : {0} \t num W {1} \t num P {2} num L {3} \t points {4}\n", selid,
numWins, numPlcs, numLosses, (3.0 * numWins + numPlcs) / (numWins + numLosses));
}
Лучшим способом было бы сделать все это как один запрос:
select
r.selectionid,
count (1) filter (where m.markettype = 'WIN' and r.status = 'WINNER') as win,
count (1) fitler (where m.markettype = 'PLACE' and r.status = 'WINNER') as place,
count (1) filter (where m.markettype = 'WIN' and r.status = 'LOSER') as lose
from
arunners r
join amarkets m on m.marketid = r.marketid
where
r.status != 'REMOVED'
group by
r.selectionid
Возможно, я упустил некоторые нюансы в вашей логике, но, надеюсь, вы поняли идею.Это должно сделать одним махом, быстро и эффективно, то, что делает ваша логика C #.Это будет намного удобнее для базы данных, а для больших наборов данных должно быть немного быстрее.