Mam pytanie odnośnie Linq, chcę mieć kontrolę nad transakcyjnością. Mam kod
jak poniżej. Tworzę połączenie i transakcję, po zapytaniu zamykam transakcję
i połączenie. Jednak gdy jeszcze raz odwołuję się do "select", to linq
tworzy mi nowe połączenie i wykonuje zapytanie (sprawdzam Profilerem). Ja
chciałbym, żeby po zamknięciu połączenia, nie było już możliwości
wykonywania zapytań!
Jak rozwiązać ten problem ?
SqlConnection dbc = new SqlConnection("MojConnectionString");
SqlTransaction transaction = null;
try{
dbc.Open();
transaction = dbc.BeginTransaction();
DataClassesDataContext db = new DataClassesDataContext(dbc);
db.Transaction = transaction;
var select = from o in db.tabelkas select o;
List<tabelka> listaTmp = new List<tabelka>(select); //zapytanie na bazie
transaction.Commit();
dbc.Close();
db = null;
dbc = null;
List<tabelka> listaTmp2 = new List<tabelka>(select); //wznowienie
połączenia! chcę wyjątek!
}
catch (Exception ex){
if(transaction!=null)
transaction.Rollback();
}
Dzięki za rady
to nie kłopot z Linq, tylko z rozumieniem jak działają referencje. masz
obiekt select oparty o referencję do db. potem tę referencję do db
przepinasz na null, a obiekt select DALEJ wskazuje na tamtą starą.
musisz jakoś zaburzyć parametry połączenia, tylko nie wiem jaki to ma sens,
np.
db.Connection.Dispose();
> List<tabelka> listaTmp2 = new List<tabelka>(select); //wznowienie
> połączenia! chcę wyjątek!
na pewno dostaniesz wyjątek!
Wiktor Zychla
> musisz jakoś zaburzyć parametry połączenia, tylko nie wiem jaki to ma
> sens, np.
>
> db.Connection.Dispose();
>
>> List<tabelka> listaTmp2 = new List<tabelka>(select); //wznowienie
>> połączenia! chcę wyjątek!
>
> na pewno dostaniesz wyjątek!
Po zastosowaniu:
db.Connection.Dispose();
i powtórnym odwołaniu się do "select" wyjątku niestety nie ma, a profiler
pokazuje wyraźnie, że zapytanie zostało zadane bazie - z powodzeniem.
Pozdrawiam