Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 17:52 Der er 32 kommentarer og
1 løsning

Putte data fra MySQL til ArrayList

Jeg har nogle data i en MySQL db, som jeg gerne vil have vist i en ListViewBox. Først skal jeg vel have puttet data'erne ned i et arraylist??? Eller er der en anden måde og gøre det på.

Min ListView indeholder 6 kolonner

ID
Fornavn
Efternavn
Adresse
By
Fødselsdag

Det skulle gerne ende med, at det der står i databasen. Bliver vist i den listview box. I må endelig spørge hvis i ikke helt forstår spørgsmålet, så skal jeg da prøve og omformulere det:)

Men jeg er helt på bar bund her, håber der er en der kan hjælpe
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:07 #1
Du laver en klasse ved navn Person med 6 private fields, 6 public properties,
en constructor uden argumenter, en constructor med 6 argumenter og en ToString metode.

Så laver du en MySqlConnection, en MySqlCommand med din SELECT statement, laver
en ExecuteReader som giver dig en MySqlDataReader som du bruger til at hente
alle rækker med

For hver række laver du en instans af Person som du tilføjer til din ArrayList
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 18:12 #2
MySql.Data.MySqlClient.MySqlConnection Connect;
            MySql.Data.MySqlClient.MySqlCommand Command;

            Connect            = new MySql.Data.MySqlClient.MySqlConnection();
            Command            = new MySql.Data.MySqlClient.MySqlCommand();

            Connect.ConnectionString = MyConnection;
           
                Connect.Open();//Åbner forbindelse til databasen
                Command.Connection = Connect;

                Command.CommandText = "SELECT * FROM bruger";
                Command.Prepare();

Så skal jeg vel have nogle parametre på??? Eller er det helt forkert det jeg laver
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:17 #3
lave en

using MySql.Data.MySqlClient;

og spar lidt på navnene !

:-)
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:18 #4
Det er første del af det.
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:18 #5
Jeg kan evt. lave et eksempel
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 18:21 #6
Ja det kunne være rigtigt fedt hvis du kunne lave et eksempel. Det ville gøre det meget nemmere for mig

Min tabel hedder bruger og de felter jeg skal have ud af tabellen hedder
ID
First_Name
Last_Name
City
Birth
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 18:24 #7
Her en del af den listview
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {
                                                                                    "ID_ITEM",
        "Fornavn_Item",
    "Efternavn_Item",
    "Adresse_Item",
    "By_ITEM",
    "FØD_ITEM"}, -1);

Hvor de der ID_ITEM, Fornavn_ITEM osv gerne skulle skiftes ud med det der står i db'en
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:24 #8
jeg vil ikke lave præcis dit eksempel

kun noget som viser teknikken
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:25 #9
using System;
using System.Collections;
using System.Data;

using MySql.Data.MySqlClient;

namespace E
{
    [Serializable]
    public class Rec
    {
        private int f1;
        private string f2;
        public Rec() : this(0, "")
        {
        }
        public Rec(int f1, string f2)
        {
            this.f1 = f1;
            this.f2 = f2;
        }
        public int F1
        {
            get
            {
                return f1;
            }
            set
            {
                f1 = value;
            }
        }
        public string F2
        {
            get
            {
                return f2;
            }
            set
            {
                f2 = value;
            }
        }
        public override string ToString()
        {
            return ("[" + f1 + "," + f2 + "]");
        }
    }

    public class DataGateway
    {
        public static ArrayList GetAll()
        {
            MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
            con.Open();
            MySqlCommand cmd = new MySqlCommand("SELECT F1,F2 FROM T1", con);
            ArrayList list = new ArrayList();
            MySqlDataReader rdr = cmd.ExecuteReader();
            while(rdr.Read())
            {
                list.Add(new Rec((int)rdr[0], (string)rdr[1]));
            }
            rdr.Close();
            con.Close();
            return list;
        }
    }
    public class TestClass
    {
        public static void Main(string[] args)
        {
            ArrayList list = DataGateway.GetAll();
            foreach(Rec r in list)
            {
                Console.WriteLine(r);
            }
        }
    }
}
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 18:33 #10
Det er også helt fint. Tror godt jeg kan finde ud af det nu:)

Smid et svar.

Må jeg godt spørge dig igen, hvis jeg nu lige skulle komme i tvivl om noget i dit eksempel?
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 18:36 #11
Den der [Serializable] hva gør den?
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:39 #12
svar

ja da
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:41 #13
den gør at objekterne kan serialiseres d.v.s. skrives til disk fil eller socket
binært på en meget nem måde (og læses igen)
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 18:42 #14
Og det gælder kun for klassen Rec?
Avatar billede arne_v Ekspert
28. oktober 2005 - 18:45 #15
det er en attribut på klassen Rec - ja

men du behøver den ikke - den var bare i den kode som jeg tilrettede
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 21:04 #16
Den compiler fint programmet. Men så når jeg prøver og skrive den Arraylist ud til en fil får jeg følgende fejl

An unhandled exception of type 'System.InvalidCastException' occurred in LoginSystem.exe

Additional information: Specified cast is not valid.


I den her linje

list.Add(new Rec((int)rdr[0], (string)rdr[1]));

Ved du hva jeg gør galt?
Avatar billede arne_v Ekspert
28. oktober 2005 - 21:06 #17
nu skulle du vel have 6 oplysninger ikke 2 ??

men fejlen betyder at første kolonne ikke var int eller anden kolonne ikke var string

du skal tilrette den linie efter typen af de felter som du henter
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 21:48 #18
Okay tak:)

Jo jo, men jeg ville bare lige prøve og teste først
Avatar billede arne_v Ekspert
28. oktober 2005 - 21:52 #19
så skal du bare sørge for at din test tabel har F1 som INTEGER og F2 som VARCHAR
Avatar billede alex_sleiborg Nybegynder
28. oktober 2005 - 21:56 #20
Det virker nu:)

Jeg takker rigtig mange gange for hjælpen
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 09:44 #21
Hvordan får jeg den klasse Rec til og returnere 6 strenge i stedet for 1?

For det hele skal ikke samles i 1 streng, men 6 forskellige
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 09:46 #22
For jeg kan vel bare lave 6 forskellige klasser. Men det er vel ikke særligt smart??
Avatar billede arne_v Ekspert
31. oktober 2005 - 10:30 #23
en klasse med 6 fields & properties

du kan så hente de 6 oplysninger individuelt med get property
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 10:53 #24
public class Person
    {
        private int f1;
        private string f2;
        private string f3;
        private string f4;
        private string f5;
        private int f6;
        public Person() : this(0, "", "", "", "", 0)
        {
        }
        public Person(int f1, string f2, string f3, string f4, string f5, int f6)
        {
            this.f1 = f1;
            this.f2 = f2;
            this.f3 = f3;
            this.f4 = f4;
            this.f5 = f5;
            this.f6 = f6;
        }
        public int F1
        {
            get
            {
                return f1;
            }
            set
            {
                f1 = value;
            }
        }
        public string F2
        {
            get
            {
                return f2;
            }
            set
            {
                f2 = value;
            }
        }
        public string F3
        {
            get
            {
                return f3;
            }
            set
            {
                f3 = value;
            }
        }
        public string F4
        {
            get
            {
                return f4;
            }
            set
            {
                f4 = value;
            }
        }
        public string F5
        {
            get
            {
                return f5;
            }
            set
            {
                f5 = value;
            }
        }
        public int F6
        {
            get
            {
                return f6;
            }
            set
            {
                f6 = value;
            }
        }
        public override string ToString()
        {
            return ("" + f1 + "");
   
        }
    }

Her er klassen. Den sidste metode der er

public override string ToString()
        {
            return ("" + f1 + "");
   
        }
Returnere jo kun f1. Hvor kan jeg hente de andre ud af klassen. Hvis du kunne give et lille eksempel. Så ville det være super:)
Avatar billede arne_v Ekspert
31. oktober 2005 - 10:54 #25
r.F6 henter f6 ud af r
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 11:01 #26
Nu virker det 100%. Og jeg har ikke engang brug for og override ToString

Tak Arne.

Ved du hvorfor den er så langsom. Der går 3 - 4 sek. inden den får vist data'erne i den listview box
Avatar billede arne_v Ekspert
31. oktober 2005 - 11:03 #27
Det er altid godt at have en ToString - fordi så kan du bare udskrive r som en
del af fejl søgning - det er ganske rigtigt ikke så tit at ToString skal bruges
overfor slut brugeren
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 11:05 #28
Hmm. Det er kun når man lige starter programmet. Ellers er den hurtig nok:)
Avatar billede arne_v Ekspert
31. oktober 2005 - 11:10 #29
er det hver gang eller kun første gang du kører app ?
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 11:16 #30
Hver gang jeg starter applikationen op. Men det er kun første gang den lige skal skrive eller læse fra databasen. Så det er ikke noget der betyder noget
Avatar billede arne_v Ekspert
31. oktober 2005 - 11:18 #31
det kunne være database connect som tager tid
Avatar billede alex_sleiborg Nybegynder
31. oktober 2005 - 11:23 #32
Det må det næsten være. Men f.eks. når jeg opretter en bruger, så lukker jeg forbindelsen igen. Med Con.Close();

Så burde den da skulle oprette forbindelse igen
Avatar billede arne_v Ekspert
31. oktober 2005 - 11:26 #33
nej fordi .NET bruger connection pooling
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