Avatar billede brian0905 Nybegynder
13. maj 2007 - 22:53 Der er 6 kommentarer og
1 løsning

nestede forespørgsler mod DB

Hejsa,
Jeg er løbet ind i et problem med min objektstruktur, håber i kan hjælpe. Jeg har nogle brugere (klasser) som er gemt i en database, jeg vil nu gerne hente en liste ud med alle brugere, det gør jeg ved disse 4 metoder:

private void OpenDB()
    {
        if (this.conn.State == ConnectionState.Closed)
        {
            this.conn.Open();
        }
           
    }

    private void CloseDB()
    {
        this.conn.Close();
    }

public override List<User> LoadAllUsers()
    {
        OpenDB();
        MySqlCommand command = conn.CreateCommand();
        command.CommandText = "select user_id from wedding_user";
        MySqlDataReader reader = command.ExecuteReader();
        List<User> result = new List<User>();
        while (reader.Read())
        {
            int userid = reader.GetInt32(0);
            User user = LoadUser(userid);
            result.Add(user);
        }
        CloseDB();
        return result;
    }

    public override User LoadUser(int id)
    {
        OpenDB();
        MySqlCommand command = conn.CreateCommand();
        command.CommandText = "select user_id, user_name, user_password, user_firstname, user_lastname, user_description, user_mobile, user_phone, user_email from wedding_user where user_id = ?id";
        command.Parameters.AddWithValue("?id", id);
        MySqlDataReader reader = command.ExecuteReader();
        User result = new User();
        while (reader.Read())
        {
            result.Id = reader.GetInt32(0);
            result.Username = reader.GetString(1);
            result.Password = reader.GetString(2);
            result.Firstname = reader.GetString(3);
            result.Lastname = reader.GetString(4);
            result.Description = reader.GetString(5);
            result.Mobile = reader.GetString(6);
            result.Phone= reader.GetString(7);
            result.Email = reader.GetString(8);
        }
        CloseDB();
        return result;
    }

problemet er naturligvis at jeg i min "LoadUser" åbner en forbindelse, så kalder jeg loaduser, som også åbner den samme forbindelse.... og det kan man naturligvis ikke, nogle løsningsforslag??? Jeg er ikke meget for at skulle til at dublikere min sql til den der loader hele listen
Avatar billede erikjacobsen Ekspert
13. maj 2007 - 23:10 #1
Ja, det nemmeste ville jo være at duplikere koden i LoadAllUsers. Det ville også være det hurtigste. Men et andet nemt hack ville være at proppe id-erene i en arraylist i LoadAllUsers, lukke forbindelsen, og så i gennemløbet af den arraylist kalde LoadUser.
Avatar billede erikjacobsen Ekspert
13. maj 2007 - 23:11 #2
Og der er vel en god grund til at du ikke håndtere exceptions på nogen måde? Bare et legetøjssystem?
Avatar billede Syska Mester
14. maj 2007 - 01:35 #3
Kan du ikke join de 2 tables ? ... lader ikke til at være noget specielt du hiver ud fra den første LoadAllUsers alligevel ...

og så bare beholde den første hvis du alligevel skal bruge det til noget ... som at hente en user ud fra et ID ...

// ouT
Avatar billede erikjacobsen Ekspert
14. maj 2007 - 07:18 #4
"de 2 tables"  -  det er den samme tabel :=)
Avatar billede arne_v Ekspert
14. maj 2007 - 08:58 #5
drop conn som field og lad OpenDB returnere en saadan
Avatar billede brian0905 Nybegynder
14. maj 2007 - 09:18 #6
hehe Arne, takker, selvfølgelig.... giv lige et svar :-)
Avatar billede arne_v Ekspert
18. maj 2007 - 03:27 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester