Wysypywanie się skryptu co ok 250 rekordów.

0

Napisałem sobie programik, który wysyła maile do moich klientów.
Ale co ok 250 rekordów wywala fatal error.
Coś takiego


Szczegółowe informacje na temat wywoływania debugowania w trybie JIT (just in time)
zamiast tego okna dialogowego znajdują się na końcu tego komunikatu.

         * Tekst wyjątku **************

MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during data read. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed. ---> System.IO.EndOfStreamException: Dokonano próby odczytu poza końcem strumienia.
w MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
w MySql.Data.MySqlClient.MySqlStream.LoadPacket()
w MySql.Data.MySqlClient.MySqlStream.LoadPacket()
w MySql.Data.MySqlClient.MySqlStream.ReadPacket()
w MySql.Data.MySqlClient.NativeDriver.FetchDataRow(Int32 statementId, Int32 columns)
w MySql.Data.MySqlClient.Driver.FetchDataRow(Int32 statementId, Int32 columns)
w MySql.Data.MySqlClient.ResultSet.GetNextRow()
w MySql.Data.MySqlClient.ResultSet.NextRow(CommandBehavior behavior)
w MySql.Data.MySqlClient.MySqlDataReader.Read()
w MySql.Data.MySqlClient.MySqlDataReader.Read()
w WindowsFormsApplication1.Form1.button5_Click(Object sender, EventArgs e) w C:\Users\Tomek\documents\visual studio 2010\Projects\Nowe\Nowe\Form1.cs:wiersz 582
w System.Windows.Forms.Control.OnClick(EventArgs e)
w System.Windows.Forms.Button.OnClick(EventArgs e)
w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
w System.Windows.Forms.Control.WndProc(Message& m)
w System.Windows.Forms.ButtonBase.WndProc(Message& m)
w System.Windows.Forms.Button.WndProc(Message& m)
w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

O co chodzi?

0

Namierzyłem, że to nie maile wywalają programik tylko UPDATE bazy. Chodzi o to że jak wysłał to ma zapisać w bazie, że poszło.


MySqlConnection polaczenie = new MySqlConnection(mojePolaczenie);
                polaczenie.Open();
                MySqlConnection polaczenie2 = new MySqlConnection(mojePolaczenie);
                polaczenie2.Open();
                zapytania = polaczenie.CreateCommand();
                z...
}
                polaczenie2.Close();
                polaczenie.Close();


Takie coś spłodziłem. Wysypuje pomiędzy 100 a 250 rekordach.

0

Ustaw breakpointa i linia po linii sprawdź co się dzieje.
zapytania.ExecuteNonQuery(); Co to robi?

0
zapytania.ExecuteNonQuery(); 

nic nie robi. Ale po wywaleniu to samo.

po wykonaniu ok 135 pętli w while (dr.Read()) zwróciło NullReferenceExcepcion. Ale dlaczego?

0

Daj while (dr.Read() != null)

0

Zamień:

MySqlDataReader dr = zapytania.ExecuteReader(CommandBehavior.CloseConnection);

na:

MySqlDataReader dr = zapytania.ExecuteReader();

Oraz dodaj po while(...){...}

dr.Close(); 

Pewnie ten magiczny auto zamykacz coś psuje.

Czemu operujesz na dwóch połączeniach jedno nie wystarcza?

0

ja bym zapytał po co takie kombinacje??

UPDATE firmy set mejling=1 WHERE id in (SELECT id FROM firmy WHERE adresdor LIKE '%" + JakieWojewodztwoO + "%' AND email <> '' AND mejling=0 LIMIT 200)

za jednym zapytaniem

0

Naniosłem poprawki i dalej nic.

dam1an -

(dr.Read() != null)

nic nie zmieniło, nadal fatal error

DibbyDum - też bez zmian po tych poprawkach.

abrakadaber - mam to rozbite bo pomiędzy select a update wysłany jest mail. Ale w tej chwili ta część kodu jest wycięta, żeby nie przeszkadzała.

Jakiś jeszcze pomysł? :(

0

To musi być inny błąd albo występować gdzie indziej, niemożliwe żeby weszło w pętle jeśli dr jest nullem.
A co masz w inner exception?

0
harbii napisał(a):

abrakadaber - mam to rozbite bo pomiędzy select a update wysłany jest mail. Ale w tej chwili ta część kodu jest wycięta, żeby nie przeszkadzała.

a nie sądzisz, że to ten kawałek kodu może powodować problem

0

abrakadaber - tak problem stwarza poniższy kod.

 MySqlCommand c2 = new MySqlCommand("UPDATE firmy set mejling=1 WHERE id=" + O_idmail + "", polaczenie2);
                c2.CommandTimeout = 120;
                c2.ExecuteNonQuery();

Po jego wycięciu pętla przechodzi poprawnie.

Jak to przerobić aby było ok?

0

Na początek dałbym średnik na końcu update. Nie wiem, czy pomoże, ale będzie bardziej elegancko. Co do elegancji to jeszcze można by te stringi jakoś inaczej sklejać, niż zwykłym +.

0

Średnik dodany , dalej to samo.

0

Mam wrażenie, że ten wątek http://forums.mysql.com/read.php?38,579848,579848#msg-579848 zawiera podobny problem do Twojego, nie wczytywałem się jednak zbytnio...

0

HA!
Temat ogarnięty pomógł trochę w tym DibbyDum. Faktycznie otwierałem otwarte już połączenie i coś mu się widocznie krzaczyło. Teraz podepnę wysyłanie maili zobaczymy czy błędy zniknęły i tu.

Dziwny błąd danych podczas wysyłania maili też znikł.

Wielkie dzięki za pomoc.

0

Niestety radość szybko się skończyła. W testach było ok ale podczas normalnej pracy znowu fatal error. Ustawiłem limit 100 i się nie wysypuje. I tak chyba zostawię.

0

Zapisz gdzieś w programie które maile się wysłały które nie i potem jednym zapytaniem zaktualizujesz bazę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1