Avatar billede bumle90 Nybegynder
04. november 2004 - 20:33 Der er 25 kommentarer

Hvordan kopierer jeg indholdet af 1 datatable over i en anden?

Hvordan kopierer jeg indholdet af 1 datatable over i en anden?
De har helt ens kolonner
Avatar billede jepsen999 Nybegynder
04. november 2004 - 20:40 #1
Der ligger en copy-metode på datatable:
table2 = table1.Copy();

Den skaber et nyt Datatable-objekt, så det hjælper selvfølgelig ikke så meget hvis du gerne vil beholde referencen til den oprindelige table2.

Ellers bliver du vist nødt til at gennemløbe rækker og kolonner manuelt.
Avatar billede bumle90 Nybegynder
04. november 2004 - 20:41 #2
Ja det er fint...Men jeg skal kopiere den over i....Dvs. så jeg har 1 tabel indeholdene al data fra tabel1 + tabel2
Avatar billede bumle90 Nybegynder
04. november 2004 - 20:42 #3
med Copy(); overskriver jeg jo den ene ik sandt?
Avatar billede jepsen999 Nybegynder
04. november 2004 - 20:46 #4
jo
Avatar billede bumle90 Nybegynder
04. november 2004 - 20:47 #5
okay...jeg har prøvet at lave denne metode...Men noget går galt...Kan du gennemskue det?

        protected System.Data.DataTable mergeTables(System.Data.DataTable t1,System.Data.DataTable t2)
        {
            System.Collections.IEnumerator ie=t2.Rows.GetEnumerator();
            while(ie.MoveNext())
            {
                System.Data.DataRow tempRow;
                System.Data.DataRow newRow;
                System.Data.DataColumn tempCol;

                System.Collections.IEnumerator ie2=t1.Columns.GetEnumerator();
                newRow=t1.NewRow();
                tempRow=(System.Data.DataRow)ie.Current;
                while(ie2.MoveNext())
                {
                    tempCol=(System.Data.DataColumn)ie2.Current;
                    newRow[tempCol.ColumnName]=tempRow[tempCol.ColumnName];
                }
               
                t1.Rows.Add(tempRow);
            }
            return(t1);
        }
Avatar billede jepsen999 Nybegynder
04. november 2004 - 20:57 #6
Nej jeg kan ikke se nogen fejl. Hvad går galt?

Kan du forresten ikke bare kopiere rækkerne over:
private void MergeTable(DataTable sourceTable,DataTable destinationTable)
{
    foreach (DataRow row in sourceTable.Rows)
    {
        destinationTable.Rows.Add(row);
    }
}

med samme tabelstruktur burde det vel være iorden?
Avatar billede jepsen999 Nybegynder
04. november 2004 - 20:59 #7
medmindre der findes constraints eller primary key i tabellen, - og det gør der vel typisk.
Kan det være det der går galt i dit eksempel?
Avatar billede jepsen999 Nybegynder
04. november 2004 - 21:05 #8
Jeg bliver nødt til at løbe.
Sidste ide:
Et dataset har en merge metode der tager en tabel som parameter. Det kan være du kan bruge den.
Avatar billede snepnet Nybegynder
05. november 2004 - 09:41 #9
Hvis du har en tabel i et DataSet, kan du kopiere den sådan her :

DataTable copy = someDataSet.Tables[0].Copy();

Mvh
Avatar billede bumle90 Nybegynder
05. november 2004 - 15:01 #10
Snepnet...som sagt skal jeg tilføje tabellen til en anden tabel..Ikke blot kopiere den....
Avatar billede snepnet Nybegynder
05. november 2004 - 15:11 #11
Undskyld...

Så skal du enten merge som jepsen foreslog (kan kun gøres på datasets), eller bruge den anden fremgangsmåde jepsen også foreslog.
Du kan dog ikke bruge den direkte :

foreach (DataRow row in sourceTable.Rows)
{
  destinationTable.Rows.Add(row);
}

Vil smide en exception, men du kan bruge
foreach (DataRow row in sourceTable.Rows)
{
  destinationTable.ImportRow(row);
}

Så skulle det gå fint.

mvh
Avatar billede bumle90 Nybegynder
05. november 2004 - 16:26 #12
Cool..jepsen99 jeg brugte dit eksempel så jeg er næsten nødt til at gi dig point :) Du var først ude...Sorry Snepnet....Men også tak for hjælpen til dig :)
Avatar billede bumle90 Nybegynder
05. november 2004 - 16:26 #13
Så hvis du gider smide point
Avatar billede snepnet Nybegynder
05. november 2004 - 16:31 #14
det er som det skal være bumle - det jeg skrev var blot en kommentar ovenpå jepsens, så alt er fint :o)
mvh
Avatar billede jepsen999 Nybegynder
07. november 2004 - 11:57 #15
ok, her er et svar.
Avatar billede bumle90 Nybegynder
07. november 2004 - 12:46 #16
okay....jeg bliver nødt til at sige at alt ikke er helt vel alligevel. Det virker fint hvis jeg kun skal kopiere en tabel over i den anden...Men så snart jeg begynder at kalde den succsetivt x-antal gange.....mere end 1 gang får jeg følgende fejl:

This row already belongs to another table

Hvordan undgår jeg det?
Avatar billede bumle90 Nybegynder
07. november 2004 - 12:55 #17
forlaengninger=new Datatable der laves ud fra et xmlschema(XSD) så den får et bestemt udseende

protected System.Data.DataTable mergeTables(System.Data.DataTable sourceTable,System.Data.DataTable destinationTable)
        {
            foreach (System.Data.DataRow row in sourceTable.Rows)
            {
                destinationTable.Rows.Add(row);
            }   
            return destinationTable;
        }

public constructor()
{
            System.Collections.IEnumerator en=mainReport.Rows.GetEnumerator();
            System.Data.DataRow row;
            while(en.MoveNext())
            {
                System.Data.DataRow curRow=(System.Data.DataRow)en.Current;
                string certId=curRow["CertId"].ToString();

            /***********************Udfyld forlaengninger*******************/
               
                System.Data.IDbDataAdapter ida=new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [forlaengtabel] WHERE certId='"+certId+"'",connectionstr);
                System.Data.DataSet ds=new System.Data.DataSet();
                ida.Fill(ds);
                forlaengninger=mergeTables(forlaengninger,ds.Tables[0]);
    /****************************************************************/
            }
}
Så det der sker er at for hver gennemløb i mainReport datatable skal der laves et opslag i databasen baseret på certID og disse data skal apendes til min forlaengninger datatable. Er i med på hvad der sker?
Og så får jeg ovenstående fejl.....Hvad kan jeg gøre for at hele tiden apende den nye forlaengtabel på den gamle??
Avatar billede snepnet Nybegynder
07. november 2004 - 13:44 #18
hej bumle... prøv at læs den jeg skrev her 05/11-2004 15:11:07
(den exception du får er den jeg henviste til.... du skal bruge ImportRow hvis du vil have en kopi af rækken ind).
Avatar billede bumle90 Nybegynder
07. november 2004 - 14:03 #19
snepnet...Det må du undskylde :) Jeg er blind. Jeg prøver den
Avatar billede bumle90 Nybegynder
07. november 2004 - 14:17 #20
Hmmm det ser ud til at virke....Men jeg er løbet ind i et andet problem nu...Håber det er okay jeg spør her...Ellers opretter jeg et nyt spg. til dig.
Problemet er at jeg skal bruge de her datatables til at generere nogle certifikater i pdfform(vha. crystal reports). Det duer også fint, men grunden til at jeg skal lave alt det her datatablemerging er fordi jeg skal skrive måske 100 rapporter ud på en gang. Det er jo godt nok lidt tidskrævende, så jeg tænkte på om du ved hvor jeg sætter tidsfristen til en side der loades op. Jeg får nemlig en "web application not available" fejl efter jeg har ventet i 1 minuts tid..
Avatar billede snepnet Nybegynder
07. november 2004 - 14:38 #21
man kan sætte timeouts på forskellige ting - dels på applikationsniveau (det er noget du gør på IIS'en, dit applicationsite/properties/virtual directory/configuration/options/script timeout
(står typisk til 90 sekunder som default).

men der er visse ting... f.eks. kald til databaser og den slags hvor du kan gøre det seperat på dem (men du er nok stadig bundet til det der står i IIS'en).

du kan også gøre det, at du starter det op i en tråd for sig - og så spørger på den engang imellem.
dette kan gøre på en meget elegant måde, så du faktisk kan realisere en rimelig reel statusbar hos klienten (uden at brugeren oplever postbacks undervejs), men der skal lidt forskellige trix til for at fikse det på den måde.

mvh
Avatar billede snepnet Nybegynder
07. november 2004 - 14:41 #22
og det er selvfølgelig helt ok at du spørger :o) - bare gå til den... det er det vi er her for.
/snep
Avatar billede bumle90 Nybegynder
07. november 2004 - 14:54 #23
Hmmm ja...måske en meget sej ide den med tråden.....Hvordan skulle jeg gøre det i praksis.
lige nu har jeg jo en .aspx side der i pageload hiver et par parametre ud af querystring kalder reportHandleren som opretter rapporten, og derefter får rapporten ud som en bytearray(pdfform) som jeg skriver til klient vha. response.binarywrite.
Hvis jeg fx. skulle vise en statusbar hos klienten som indikerer hvor langt tråden er kommet med at loade rapporterne...hvordan skulle jeg lave det?
Avatar billede snepnet Nybegynder
07. november 2004 - 15:10 #24
Hej igen :o)

Nogle hovedtræk der kunne realiserer det kunne være som følger :

1)
På kommandoen om at der skal genereres en rappport, opretter du (og starter tråden).

2)
Du renderer siden tilbage til brugeren med en statusbar ell.
(sådan lidt "dine rapporter er ved at blive genereret blablabla.")

3)
På siden har du et javescript som er i stand til at påvirke din statusbar på baggrund af oplysninger den henter på serveren.
Til det skal du bruge en form som kan spørge på status på din tråd, og skrive denne status tilbage.
Scriptet vil så med et passende interval* spørge serveren om den nye status, og denne status vil så blive vist i status baren.

4)
Når tråden er kørt færdig kan den side brugeren kigger på så lave et postback, og vise resultatet på samme siden - eller ved at redirecte til en resultatside.

*
Hvis du har sådan en "dobbelt-statusbar" der øverst viser fremgang for nuværende, og nederst viser total fremgang, kan du gøre det på den måde at scriptet forespørger om nu status når den øverste bar er udfyldt... Det giver en ganske god effekt.
(en lille teksboks, hvor der står hvad der indtil videre er sket plejer også at give en god effekt.... f.eks. "Der er genereret X ud af Y rapporter" X og Y er så også det du bruger til at vise den totale fremgang).

mvh
Avatar billede bumle90 Nybegynder
07. november 2004 - 15:14 #25
Superfed ide :)
Jeg prøver at lege lidt med den :)
Tak skal du have...
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