System.NullReferenceException - nie wiem gdzie jest blad

0

Witam

Mam watek do obsługi klientów w ktory po podaniu prawidlowego loginu i hasla klient zostaje utworzony oddzielny watek i tam jest obslugiwany tylko ze prze probie autoryzacji ,gdy sie wywoluje funkcjachechPass to zawsze mi rzuca bledem takim jak w tytule.
obiekty

MySqlConnection sqlcon = null;
MySqlCommand query = null;
MySqlDataReader reader = null; 

sa globalne. Connector nawiozal polanczeni w głównym watku programu. jak sobie z tym poradzic.
Dopiero zaczynam prace na watkach i w c# wiec prosze o jakie takie wytlumaczenie :)

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                listen.Start();
                logoperator("Oczekuje na polanczenie");
                while (true)
                {
                    klient = listen.AcceptTcpClient();
                    logoperator("Klient polonczony");
                    NetworkStream ns = klient.GetStream();
                    BinaryReader br = new BinaryReader(ns);
                    string dane = br.ReadString();
                    logoperator(dane);
                    string[] cmd = dane.Split(new char[] { ':' });
                    //
                    if (cmd[0] == "LOG")
                    {
                        BinaryWriter bw = new BinaryWriter(ns);
                        if (konta.BinarySearch(cmd[1]) > -1)
                        {
                            if (chechPass(cmd[1], cmd[2]))
                            {
                                bw.Write("LOGOK");
                                BackgroundWorker watek = new BackgroundWorker();
                                watek.WorkerSupportsCancellation = true;
                                watek.DoWork += new DoWorkEventHandler(watek_DoWork);
                                nazwaKlientow.Add(cmd[1]);
                                listaKlientow.Add(watek);
                                watek.RunWorkerAsync();
                            }
                            else
                            {

                                logoperator("Blad autoryzacji:" + cmd[1]);
                            }
                        }
                        else
                        {
                            logoperator("Brak uzytkownika");
                        }
                    }
                }
            }
                catch
            {
                    listen.Stop();
                    logoperator("Server stop");
            }
            

funkcja checkpass

private bool chechPass(string login,string pass)
        {
            
  
            string dbpass = null;
            query = sqlcon.CreateCommand();
            query.CommandText = "SELECT passwd FROM account WHERE nr=" + login + ";";
            try
            {
                
                reader = query.ExecuteReader();
                reader.Read();
                //dbpass = reader.GetString(0);
                logoperator(dbpass);
                
            }
            catch(MySqlException e)
            {
                logoperator(e.ToString());
            }
            if (dbpass == pass)
                return true;
            else
                return false;
        }
0

Skoro masz wyjątek to masz również podany stack trace, więc powinieneś dokładnie wiedzieć gdzie wyjątek został rzucony. Teraz stawiasz w danej linii breakpoint, uruchamiasz program pod kontrolą debuggera i patrzysz co jest nie tak.

0

przy wywolaniu
reader.Read();
wyrzuca wyjatek.
jak wstawie tam break pointa i sprawdze czy reader ma jakos wartośc to jest null.czemu nie dziala to reader = query.ExecuteReader();?

1

skoro jest null to znaczy że go nie inicjujesz, i to jest właśnie przyczyna wyjątku.
Co to za reader i squlcon, nie widziałem nigdzie inicjacji?
Nie znam się na tym, ale skoro powinno...
A sqlcon.CreateCommand() ci działa?

0

wlasnie nie wiem dlaczego on sie nie inicjuje
a ten reader i sqlcon to zmiene globlane

MySqlConnection sqlcon = null;
        MySqlCommand query = null;
        MySqlDataReader reader = null;

w innym miejscu programu tez czytam z bazy podobnymi metodami i dziala poprawnie:

private void loadAcc()
        {
            query = sqlcon.CreateCommand();
            query.CommandText = "SELECT nr FROM account";
            int i = 0;
            logoperator("Wczytywanie kont");
            try
            {
                reader = query.ExecuteReader();
                while (reader.Read())
                {
                    konta.Add(reader.GetString(0));
                    i++;
                }
                reader.Close();
                query.Cancel();
                reader = null;
                query = null;
                logoperator("Wczytano: " + i + " kont");
            }
            catch
            {
                logoperator("Blad przy wczytywaniu kont");
            }
}
0

Nie wiem czemu masz ten błąd, ale architektura słaba.

Zapomnij o tych "zmiennych globalnych" (by the way: w C# nie ma czegoś takiego jak zmienna globalna), i za każdym razem gdy chcesz coś wykonać na bazie danych - użyj nowych instancji Connection, Command, i Reader. To powinno naprawić błąd.

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