2010-03-15 11 views
7

Dostaję następujący błąd, gdy mój kod tworzy DataTableReader z ważnego obiektu DataTable: „DataTableReader jest nieprawidłowa dla bieżącego DataTable«Temptable»”DataTableReader jest nieprawidłowy dla bieżącej DataTable „Temptable”

Chodzi o to, że jeśli ponownie uruchomię komputer, działa on przez nieokreślony czas, a następnie umiera z powyższym. Kod, który rzuca ten błąd, mógł działać dobrze przez wiele godzin, a następnie: bang. pojawia się ten błąd. Nie ogranicza się do jednej linii; jest to każda lokalizacja, w której używany jest DataTableReader. Ten błąd NIE występuje również na serwerze produkcyjnym - nigdy.

To doprowadza mnie do szału przez większą część tygodnia, a nie udało mi się znaleźć niczego w Google, które mogłoby pomóc (ponieważ jestem całkiem pozytywna, to nie jest problem z kodowaniem).

Niektóre dane techniczne:

DEV Box: Vista 32bit (wszystkie bieżące aktualizacje Windows) Visual Studio 2008 v9.0.30729.1 SP dotNet Framework 3.5 SP1

SQL Server: Microsoft SQL Server 2005 Standardowy Edition- 9.00.4035.00 2003 64bit (x64) Okna (z wszystkimi bieżącymi aktualizacjami Windows)

Web Server: 64bit Windows 2003 (z całym bieżącym windo aktualizacje ws)

Każda pomoc, pomysł lub porada będą mile widziane!

UPDATE 1:

Ok - Próbowałem następujące teraz bez powodzenia:

1: restartem 2: SFC/scannow 3: Zmieniono serwery SQL 4: Próbowałem inną metodę, która wykorzystuje DataTableReaders 5: Oczyszczone rozwiązanie

Jedyne co znalazłem, że pracował była kopia & wklejeniu kodu od głównego programu Visual studio przykład, do drugiego, który miał SIMP aplikacja konsolowa. To wtedy pracował zgodnie z oczekiwaniami (kwerendy bazy danych i dostaje wyniki w DataTable, stworzył datatablereader na tym stole, po czym zapytał hasrows przed wywołaniem .read() ... których pracowali.

walczę, aby zobaczyć co może być przyczyną tego, jak nie ma żadnych usterek code - jestem 100% pewna, jak to działa idealnie gdy opublikowane na serwerze internetowym

+0

(Zakładając, że masz serwer SQL hostowany lokalnie) jest twój lokalny dysk mało miejsca? –

+0

dobre pytanie, a jeden nie sprawdziłem ... ale niestety mam akry wolnego miejsca na każdym dysku (dokładniej 817GB) – Sk93

+0

Próbowałem polecić kolegom wyczyszczenie "C: \ WINDOWS \ Microsoft.NET \" Framework \ v2.0.50727 \ Tymczasowe pliki ASP.NET ", ale nie istniało w pierwszej kolejności. Teraz próbowałem także usunąć zaznaczenie "HasRows" i po prostu zrobić While (tr.Read()) i to nadal powoduje ten sam błąd. Wreszcie, aby w 100% wyeliminować szansę, próbowałem z użyciem bloku i nadal otrzymuję ten sam błąd. – Sk93

Odpowiedz

7

ja.. Myślę, że używanie czasu (read.read()) może rozwiązać twój problem

if (myReader.HasRows) 
    while (myReader.Read()) 
    Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1)); 
else 
    Console.WriteLine("No rows returned."); 
myReader.Close(); 

UPDATE: Również z MSDN: Nieruchomość HasRows zwraca informację o aktualnym wyniku.Jeśli DataTableReader zawiera wiele zestawów wyników, możesz sprawdzić wartość właściwości HasRows natychmiast po wywołaniu metody NextResult, aby określić, czy nowy zestaw wyników zawiera wiersze.

Użyj właściwości HasRows, aby uniknąć wymogu wywołania metody Read elementu DataTableReader, jeśli w bieżącym zestawie wyników nie ma wierszy.

DataTableReader.HasRows Property

+0

Miałem wrażenie, że OP powiedział, że to nie było połączenie z HasRows? –

+0

Prawidłowo. w twoim przykładzie (myReader.HasRows) jest linią, która rzuca wyjątek. – Sk93

1

Wrap wykorzystanie DataTableReader (i wszystkich IDisposables) z using

+0

to naprawdę nie pomoże. Tworzę obiekt, zamykam obiekt i usuwam obiekt .. jak pokazano w powyższym przykładzie kodu. – Sk93

+0

Pomoże to uniknąć innych problemów - jeśli wyjątki wystąpią przed zamknięciem czytnika, pozostanie on niezamknięty. Używanie instrukcji może temu zapobiec. –

+0

To nie do końca prawda. Jeśli zgłasza wyjątek i wykracza poza zakres, to zostanie zamknięty i usunięty za pośrednictwem garbage collecton jak zwykle. Ale tak, użycie instrukcji jest lepszym rozwiązaniem i zwykle ich używam. Jednak ten kod to "stary" kod napisany przez innego programistę ... i działał dobrze. Dzięki za wskaźnik, ale to, o co tutaj pytam, jest rozwiązaniem problemu szczegółowego ... Mam nadzieję, że rozumiesz :) – Sk93

1

OK .. Dalej w kodzie, mam następujący kod:

using (DataTableReader tr = dtCustomers.CreateDataReader()) 
{ 
    .... 
} 

Jeśli zmienię to czytać:

using (DataTableReader tr2 = dtCustomers.CreateDataReader()) 
{ 
    .... 
} 

Wtedy i tym pamiętać trochę kodu jest znacznie później w tej samej procedurze, oba kawałki kodu działają bezbłędnie!

Tak, to nie działa:

using (DataTableReader tr = dt.CreateDataReader()) 
{ 
    ... 
} 

.... 

using (DataTableReader tr = dt.CreateDataReader()) 
{ 
    ... 
} 

Ale to robi:

using (DataTableReader tr = dt.CreateDataReader()) 
{ 
    ... 
} 

.... 

using (DataTableReader tr2 = dt.CreateDataReader()) 
{ 
    ... 
} 

Nie rozumiem, dlaczego w ten sposób działa, ale to robi i jak ja nie miałem inna odpowiedź, pójdę z tym.

Jeśli wiesz, dlaczego to działa i dlaczego oryginał nie działa, czy możesz mnie oświecić? :)

1

Pomyślałem, że bym pisał tutaj na wypadek, gdyby pomógł komuś innemu. Próbowałem wielu rzeczy i po prostu zmieniłem nazwę bazy danych i zadziałało, trochę jak tutaj. Nie wiem dlaczego na pewno, ale myślę, że może to być spowodowane faktem, że data-data (pierwotnie) nie była zamknięta, więc być może po kilku debugowaniu, było dużo "rzeczy" w pamięci z pewną nazwą załączoną i powiedział "nie więcej ! ". wciąż, mógłbym mówić bullpies. moja rada, zmień nazwę zmiennej danych datareader i upewnij się, że zamykasz ją po użyciu

+1

Witamy w SO i dzięki za post. Myślę jednak, że stanowisko lepiej pasowałoby do komentarza niż odpowiedzi. Zajrzyj do [How to Answer] (http://stackoverflow.com/questions/how-to-answer), może to pomóc. –

1

Wygląda jak błąd przy pobieraniu tableReadera ... Mam kod, który działa dla uszu i jeśli zmienię inną metodę czasami dostaję tę errro ... czasami jest to rozwiązane tylko rekompilacja (przebudowa), innym razem przeinstalowałem framework .NET lub skorzystam z opcji naprawy ... zaczynam odkładać wypróbować sekcje catch, aby użyć czytnika, jeśli system "chce" przekazać czytelnikowi i DataTable, jeśli nie. Pozdrowienia.

4

Miał ten sam problem i pozbył się go po wyczyszczeniu zmiennych w oknie zegarka.

+0

'Clear Watch Window' faktycznie rozwiązało to ... Weird !! Dzięki.. – Shubh

2

Czyszczenie okna zegarka & wykonałem dla mnie odbudowy. Ponieważ jednak musiałem pamiętać o częstej odbudowie, ostatecznie zmieniłem nazwę. (przed zmianą nazwy dodanie dodatkowych zmiennych obserwacyjnych na obiekcie może spowodować, że poprzednie zmienne zegarka na tym obiekcie staną się nieważne - nawet bez przechodzenia przez kod, tj. pozostawanie w tej samej linii)

Powiązane problemy