2011-02-06 13 views
5

Używam Linq do SQL z SQL Server 2008 SP2, moja aplikacja to WinForm .net 4 Jestem importowania do SQL Server 200000 rekordów. Tworzę obiekty i dołączam je do datacontext na "insertonsubmit". Następnie robię "submitChanges" co 100 rekordów. NIE MAM ŻADNEJ TRANSAKCJI co tak naprawdę.Ta SqlTransakcja została zakończona; nie jest już użyteczny

otrzymuję ten błąd

"This SqlTransaction has completed; it is no longer usable." with stack 
at System.Data.SqlClient.SqlTransaction.ZombieCheck() 
    at System.Data.SqlClient.SqlTransaction.Rollback() 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 

Out of the blue. Ten błąd nie jest spójny, może pojawić się po 10 000 rekordach lub 27 200 rekordach lub rekordach XXX.

powodu błędu wydaje się być przypadkowe, myślałem, że to ma coś wspólnego ze zbierania śmieci ...

Każdy ma pojęcia?

+1

Czy możesz pokazać nam kod dostępu do kontekstu danych i dołączania do niego obiektów? – Luis

Odpowiedz

2

SubmitChanges ma niejawną transakcję. Problem w tym, że twoja transakcja kończy się - po prostu robisz za dużo. Dla 200k wierszy użyłbym SqlBulkCopy w tabeli pomostowej, a następnie uruchomiłbym polecenie lub SPROC, aby przenieść 200k do tabeli aktualnej; być może z tym poleceniem/SPROC w transakcji.

SqlBulkCopy jest zaprojektowany dla tego scenariusza - jest to jeden ciągły strumień lub surowy TDS danych, zamiast jednak-may okrągłym wycieczki - a na koniec serwera jest on zoptymalizowany też (ale w konsekwencji, ty koniecznością użyj tabeli pomostowej lub ryzykujesz, że wstawki nie są rejestrowane).

+2

Znalazłem rozwiązanie problemu. Wygląda na to, że między moim komputerem znajduje się zapora sieciowa z "regułami ładowania". – Varpi

+0

Czy możesz dokładniej opisać, jak to naprawić? Widzę również ten problem i nie widzę nic na ten temat na mojej zaporze. Czy to zapora systemu Windows czy coś innego? Ponadto OP powiedział, że robi submitChanges co 100 rekordów, więc to, co powiedział Marc Gravell, nie ma sensu. –

Powiązane problemy