Thread View: alt.pl.comp.lang.csharp
4 messages
4 total messages
Started by Przemysław Jedynowicz
Tue, 25 Dec 2012 22:10
MySQL - zapytanie co kilka sekund, co drugi wynik to NULL
Author: Przemysław Jedynowicz
Date: Tue, 25 Dec 2012 22:10
Date: Tue, 25 Dec 2012 22:10
88 lines
4083 bytes
4083 bytes
Witam,
Tak dla treningu chciałem napisać prostego czata... Aplikacja z polem na wpisanie pokoju, usera, oraz wiadomości + jedna tabela w bazie przechowująca id|room|user|msg|timestamp. Ustawiłem timera by po 5 sekund ściągał 1000 ostatnich rekordów z tabeli i wyświetlał w czwartym textBoxie (właściwe okno rozmowy).
Do komunikacji z bazą danych używam klasy:
class DBClass
{
private MySqlConnection mySqlCon = new MySqlConnection("Data Source=" + "ip.ip.ip.ip" + ";Port=3306;Database=" + "baza" + ";User ID=" + "user" + ";Password=" + "password");
private Exception ConnectDB()
{
try
{
mySqlCon.Open();
}
catch (Exception ex)
{
return ex;
}
return null;
}
public MySqlDataReader QueryDBRead(string str)
{
if (ConnectDB() == null)
{
MySqlCommand mySqlCmd = new MySqlCommand(str, mySqlCon);
MySqlDataReader mySqlReader = mySqlCmd.ExecuteReader();
return mySqlReader;
}
mySqlCon.Close();
return null;
}
public int QueryDBOther(string str)
{
if (ConnectDB() == null)
{
MySqlCommand mySqlCmd = new MySqlCommand(str, mySqlCon);
int result = mySqlCmd.ExecuteNonQuery();
return result;
}
mySqlCon.Close();
return -1;
}
}
----
Przy trigerze z zegara wykonuję kod:
private void timer1_Tick(object sender, EventArgs e)
{
data_read = baza.QueryDBRead("select * from pjedynow_chat.chat order by id desc LIMIT 0,1000");
// if (data_read != null)
// {
textBox4.Text = "";
while (data_read.Read())
{
textBox4.Text += "<" + data_read.GetValue(1) + "> " + data_read.GetValue(3) + "\r\n";
}
// }
}
-----
Aplikacja się uruchamia, po 5 sekundach wyświetla "rozmowy", ale po kolejnych 5 sekundach wywala się... Jak do tej pory udało mi się sprawdzić wywala się ponieważ data_read przyjmuje wartość null. To co jest zakomentowane pozwala by aplikacja jakoś działała - pomija momenty gdy data_read==null.
Dwa pytania:
1. Dlaczego tak się dzieje?
2. Jak powinno się pisać komunikację w tego typu aplikacji, by można było w miarę szybko wymieniać dane z serwerem? U mnie za każdym razem łączę się na nowo z bazą... (komputer lokalny vs baza na hostingu)
Ps. Jeśli ktoś mógłby pomóc to mogę wystawić cały projekt w VS2012 EE na ftpie...
Pozdrawiam!
--
Przemysław Jedynowicz
"There's always another way - usually a better one!"
Re: MySQL - zapytanie co kilka sekund, co drugi wynik to NULL
Author: Robert Winkler
Date: Wed, 26 Dec 2012 08:38
Date: Wed, 26 Dec 2012 08:38
25 lines
1856 bytes
1856 bytes
> public MySqlDataReader QueryDBRead(string str)
> {
> if (ConnectDB() == null)
> {
>
> MySqlCommand mySqlCmd = new MySqlCommand(str, mySqlCon);
>
> MySqlDataReader mySqlReader = mySqlCmd.ExecuteReader();
>
> return mySqlReader;
> }
> mySqlCon.Close();
> return null;
> }
Zwracasz data reader i pozostawiasz otwarte połączenie do bazy
(bo inaczej nie można by niczego odczytać z tego readera).
Przy kolejnym cyklu znowu wołasz metodę ConnectDB()
przy otwartym już połączeniu, zamykasz więc je i zwracasz twój null.
Przy kolejnym cyklu połączenie do bazy będzie już zamknięte
więc ConnectDB() zadziała prawidłowo.
__
Pozdrawiam
Robert
Re: MySQL - zapytanie co kilka sekund, co drugi wynik to NULL
Author: Przemysław Jedynowicz
Date: Wed, 26 Dec 2012 09:53
Date: Wed, 26 Dec 2012 09:53
28 lines
1984 bytes
1984 bytes
Dzięki - działa :) Pozdrawiam! -- Przemysław Jedynowicz "There's always another way - usually a better one!" W dniu środa, 26 grudnia 2012 09:38:58 UTC+1 użytkownik Robert Winkler napisał: > Zwracasz data reader i pozostawiasz otwarte połączenie do bazy > > (bo inaczej nie można by niczego odczytać z tego readera). > > Przy kolejnym cyklu znowu wołasz metodę ConnectDB() > > przy otwartym już połączeniu, zamykasz więc je i zwracasz twój null. > > Przy kolejnym cyklu połączenie do bazy będzie już zamknięte > > więc ConnectDB() zadziała prawidłowo. > > > > __ > > Pozdrawiam > > Robert
Re: MySQL - zapytanie co kilka sekund, co drugi wynik to NULL
Author: slawek.skiba
Date: Thu, 03 Jan 2013 11:59
Date: Thu, 03 Jan 2013 11:59
58 lines
2433 bytes
2433 bytes
W dniu środa, 26 grudnia 2012 10:53:39 UTC+1 użytkownik Przemysław Jedynowicz napisał: > Dzięki - działa :) > > > > Pozdrawiam! > > -- > > Przemysław Jedynowicz > > "There's always another way - usually a better one!" > > > > > > W dniu środa, 26 grudnia 2012 09:38:58 UTC+1 użytkownik Robert Winkler napisał: > > > Zwracasz data reader i pozostawiasz otwarte połączenie do bazy > > > > > > (bo inaczej nie można by niczego odczytać z tego readera). > > > > > > Przy kolejnym cyklu znowu wołasz metodę ConnectDB() > > > > > > przy otwartym już połączeniu, zamykasz więc je i zwracasz twój null. > > > > > > Przy kolejnym cyklu połączenie do bazy będzie już zamknięte > > > > > > więc ConnectDB() zadziała prawidłowo. > > > > > > > > > > > > __ > > > > > > Pozdrawiam > > > > > > Robert Pomyśl o tym żeby zapamiętać timestamp ostatniej wiadomości i ciągnąć z bazy tylko nowsze a nie za każdym razem po 1000.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads