Avatar billede krestionsen Nybegynder
05. august 2004 - 19:53 Der er 17 kommentarer og
2 løsninger

køre et tabel igennem og liste dem i en listbox

Jeg har en tabel med klientid og tabelid, og for hvert tabelid med f.eks. nr. 12 skal der listes alle klientid'erne på en linje i en listbox med komma imellem, men hvordan løber jeg en tabel igennem og for hvert klientid skal det vises i en listbox på en linje med komma(,) imellem hvert klientid?

public int hentKlientTabel(int tabelid)
{
        string queryString = "SELECT [KlientTabel].[klientid] FROM [KlientTabel] WHERE ([KlientTabel].[tabelid] =" + tabelid + ")";

        System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
        dbCommand.CommandText = queryString;
        dbCommand.Connection = dbConnection;

        dbConnection.Open();

        int returnVar = (int)dbCommand.ExecuteScalar();

        dbConnection.Close();

        return returnVar;
    }
Avatar billede prec Nybegynder
05. august 2004 - 20:08 #1
for det første er brug af database objekterne en smule rodet, skriver det lige på min egen måde, håber du forstår hvad jeg vil ud fra det:

public string hentKlientTabel(int tabelid) {
    OleDbConnection conn = new OleDbConnection("dsn");
    OleDbCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT klientid FROM KlientTabel WHERE tabelid = '" + tabelid + "'";
   
    OleDbDataReader dr = cmd.ExecuteReader();
    string returnString = "";
    while(dr.Read()) {
          returnString += dr.GetInt32(0) + ", ";
    }
    return returnString;
}

jeg undskylder hvis det ikke umiddelbart virker, har ikke testet det.
Avatar billede krestionsen Nybegynder
05. august 2004 - 22:22 #2
Min hentklienttabel virker godt nok og jeg forstår godt det du har lavet, men sådan kan jeg ikke lave det, da jeg bruger metoden flere gange, hvor der ikke skal være komma med. Jeg har prøvet med en for sætning, men den returnere kun et id selv om der er flere i tabellen og jeg skal gerne have returneret alle med det tabelid

int tableid = hentKlientTabel(tabelid);

for(int i = 0; i < medmoedeid(); i++)
{
}
Avatar billede prec Nybegynder
06. august 2004 - 09:06 #3
det stykke kode jeg har skrevet til dig vil returnere alle klientid's hvor tabelid er det angivne.
Jeg forstod ikke helt det du skrev, men hvis det du mente var at der ikke skal være et komma helt til sidst i strengen kan du jo lave et count på hvor mange rækker den returnerer og så lave en tæller i while løkken, og så længe tælleren er mindre end det antal rækker der er, så skal den påføre et komma.
Avatar billede prec Nybegynder
06. august 2004 - 09:15 #4
jeg tror jeg har forstået det du skrev bedre, det du vil er at returnere en array
det gør du ved at sige at metode skal returnere en int array.
public int[] hentKlientTabel(int tabelid)

du laver så først i din kode en query til databasen der tæller hvor mange rækker den vil returnere, og herefter laver du en int array med det antal rækker:
int[] returnArray = new Int32[rowCount];

herefter laver du så det kode jeg tidligere skrev for at returnere alle rækker, og så i din while løkke, bruger du en tæller til at angive hver enkelt række i din int array:
int = 0;
while(dr.Read()) {
    returnArray[i] = dr.GetInt32(0);
    i++;
}

return returnArray;

når du så skal bruge din funktion laver du en int array ud af funktionen:
int[] klientids = hentKlientTabel(id);

og så looper du gennem arayen med en foreach:
foreach(int KlientId in klientids) {
    Response.Write(KlientId);
}
Avatar billede prec Nybegynder
06. august 2004 - 09:17 #5
tælleren i while løkken skal self. hedde: int i = 0;
Avatar billede krestionsen Nybegynder
06. august 2004 - 14:28 #6
Jeg har lavet min metode lige som din nu, men jeg får følgende fejl:

CS0029: Cannot implicitly convert type 'object'to 'System.Data.OleDb.OleDbDataReader'
Avatar billede prec Nybegynder
06. august 2004 - 15:31 #7
jeg tror du bør sætte dig ned og sætte dig lidt bedre ind i hvordan objekt orienteret programmering fungerer. især bør du nok sætte dig ind i hvad data typer er og gør.
Avatar billede krestionsen Nybegynder
07. august 2004 - 09:15 #8
Ja, det er nok rigtigt nok, men min sql metode, som jeg viste i spørgsmålet, virker fint nok, og kan jeg ikke bare kører en foreach eller en for sætning på den for at løbe tabellen igennem men hvordan?
Avatar billede snepnet Nybegynder
07. august 2004 - 10:34 #9
Du kan læse det ind i et dataset i ét hug, og efterfølgende iterere over den ene tabel du får i dit dataset.

du vil så skulle bruge en sql som :
SELECT klientid FROM KlientTabel

og det nemmeste er, hvis du opretter en adapter som du så bruger til at fylde et dateset med :

OleDbDataAdapter a = new OleDbDataAdapter(<dit commandobjekt);
DataSet ds = new DataSet();
a.Fill(ds);

foreach(DataRow dr in ds.Tables[0].Rows)
{
  Response.Write(dr[0].ToString());
}

Var det sådan noget du var ude efter ?
Avatar billede krestionsen Nybegynder
07. august 2004 - 13:07 #10
Ja, og så har prøvet at lave et dataset som det du har lavet, men så kommer den med følgende fejl:

CS0246: The type or namespace name 'DataRow' could not be found (are you missing a using directive or an assembly reference?)


    System.Data.DataSet hentKlientTabel()
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=D:\\Fam\\db1.mdb";
            System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);

            string queryString = "SELECT [klientTabel].[klientid] FROM [klientTabel]";
            System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
            dbCommand.CommandText = queryString;
            dbCommand.Connection = dbConnection;

            System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
            dataAdapter.SelectCommand = dbCommand;
            System.Data.DataSet dataSet = new System.Data.DataSet();
            dataAdapter.Fill(dataSet);

            foreach(DataRow dr in dataSet.Tables[0].Rows)
            {
                Response.Write(dr[0].ToString());
            }

            return dataSet;
        }
Avatar billede krestionsen Nybegynder
07. august 2004 - 13:08 #11
Hvad mener du med "dit commandobjekt"?
Avatar billede snepnet Nybegynder
07. august 2004 - 13:18 #12
DataRow ligger i namespace System.Data, så du skal enten skrive en
using System.Data;

eller skrive det fuldt ud hver gang du bruger det :
System.Data.DataRow, så du får sådan en her :

foreach(System.Data.DataRow dr in dataSet.Tables[0].Rows)
    // osv..

Hvad jeg mener med dit commandbjekt... jeg mener det du laver med
new System.Data.OleDb.OleDbCommand();
Avatar billede krestionsen Nybegynder
07. august 2004 - 13:44 #13
yep, det virker som det skal nu, men hvordan får jeg dem lagt ind i en listbox, så de står samlet på en linje.
Avatar billede krestionsen Nybegynder
07. august 2004 - 13:45 #14
Giv lige et svar snepnet og prec, så får i 30 point hver
Avatar billede krestionsen Nybegynder
07. august 2004 - 14:59 #15
Jeg har fået den listbox til at virke, men hvordan får jeg dataene ind i et felt i en datagrid?
Avatar billede krestionsen Nybegynder
07. august 2004 - 15:37 #16
Hvad skal man skrive i stedet for ToString(), for at få det til en int, der hvor der står "Response.Write(dr[0].ToString());"?
Avatar billede prec Nybegynder
07. august 2004 - 17:30 #17
k
Avatar billede prec Nybegynder
07. august 2004 - 17:31 #18
lol jeg klovner :P
Avatar billede snepnet Nybegynder
08. august 2004 - 12:20 #19
Svar her :o)
Du kan få det til en int på flere måder :

(int)dr[0];
int.Parse(dr[0].ToString());
Convert.ToInt(...
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