Představte si následující kód, ve kterém je využíváno jediné připojení k databázi (detaily jsou vynechány):
reader = command.ExecuteReader();
while (reader.Read()) {
...
updateCommand.ExecuteNonQuery();
...
}
Tento kód skončí výjimkou „There is already an open DataReader associated with this Command which must be closed first“.
První věcí je, že popis výjimky moc vývojáři nepomůže. Zpráva
totiž napovídá, že je s jedním Commandem asociováno víc
DataReaderů, což ale na první pohled není pravda – jediný otevřený
DataReader je asociován s objektem command
, který není
totožný s objektem updateCommand
. Navíc vykonáváme
ExecuteNonQuery a žádného DataReadera nevytváříme. Pro začátečníka
mého typu je tedy hláška zcela k ničemu, naopak je spíše matoucí.
(V souvislosti s tím doporučuji shlédnout skvělý track
PRS223: Getting Users to Fall in Love with Your Software:
2005 Edition z videí z PDC 05, kde se
na téma zbytečných hlášek pobavíte a poučíte zároveň.) Jen pro
úplnost poznamenám, že hláška svůj smysl má, protože oba objekty command
jsou propojeny přes objekt Connection a DataReader se vytváří i při
ExecuteNonQuery, protože tento příkaz vrací počet ovlivněných řádků.
Ale to je celkem jedno, hláška prostě dobrá není.
Co s tím, navíc když v .NET Frameworku beta 2 stejný kód hladce fungoval? První možností je použít workaround z příslušného bug reportu, ale elegantnější možností je trochu pozměnit connection string. Pes je totiž zakopaný v tom, že v RTM verzi .NETu dvojky je MARS defaultně vypnutý (na rozdíl od bety 2), takže je potřeba do connection stringu přidat MultipleActiveResultSets=True.
A je to.
Dík za info, třeba se to bude někdy hodit :)