Avatar billede flashit Nybegynder
18. maj 2007 - 22:42 Der er 11 kommentarer og
2 løsninger

Mange til mange - Best practices

Hej E
Jeg vil høre om der en nogle som kan hjælpe mig i den rigtige retning.
Jeg har en sqldatabase, men 3 tabeller. Disse er:
Undersøgelser
ID    Navn        dato
1    TestUndersøgelse    18-05-2007
2    EnTil        17-05-2007
Deltagere
ID    FullName
1    Jakob Mikklsen
2    Test Test
Mapping
ID    UnsersøgelseID    DeltagerID
1    1        1   
2    1        2
3    2        1

Det er jo ikke så underligt. Håber jeg da ;-)
Men det jeg gerne vil have hjælp til at hvordan koder man op i mod denne datastruktur?
Jeg har oprettet 3 dataset’s og brugt en datarelation til at sætte mine relationer. Men er det en ok metode, og hvordan indsætter  man nye rækker i tabellerne?
Jeg havde tænkt mig noget med at jeg oprettede en nt undersøgerls, og ved at benytte @@inentaty vil jeg fåden nye ID tilbage, herefter opretter jeg hvis nædvændigt nye deltagerte på samme måde, og til sidst indsætter jeg de to id’er i min mapping tabel.
Jeg syntes bare at det er en maget låst måde at gøre det på.
Hvad syntes I, og har I nogle gode forslag, til hvordan det kan/bør gøres. Måske noget med OR mapping??
Jeg arbejder i Asp.net 2.0 med VB.net som motor.
Gælder mig til at høre fra jer.
/Jakob
Avatar billede flashit Nybegynder
18. maj 2007 - 22:44 #1
Sorry, det er da ikke til at læse... Smider det lige ind igen.



Hej E

Jeg vil høre om der en nogle som kan hjælpe mig i den rigtige retning.

Jeg har en sqldatabase, men 3 tabeller. Disse er:

Undersøgelser
ID    Navn                dato
1    TestUndersøgelse    18-05-2007
2    EnTil                17-05-2007

Deltagere
ID    FullName
1    Jakob Mikklsen
2    Test Test

Mapping
ID    UnsersøgelseID    DeltagerID
1    1        1   
2    1        2
3    2        1

Det er jo ikke så underligt. Håber jeg da ;-)

Men det jeg gerne vil have hjælp til at hvordan koder man op i mod denne datastruktur?

Jeg har oprettet 3 dataset’s og brugt en datarelation til at sætte mine relationer. Men er det en ok metode, og hvordan indsætter  man nye rækker i tabellerne?

Jeg havde tænkt mig noget med at jeg oprettede en nt undersøgerls, og ved at benytte @@inentaty vil jeg fåden nye ID tilbage, herefter opretter jeg hvis nædvændigt nye deltagerte på samme måde, og til sidst indsætter jeg de to id’er i min mapping tabel.

Jeg syntes bare at det er en maget låst måde at gøre det på.

Hvad syntes I, og har I nogle gode forslag, til hvordan det kan/bør gøres. Måske noget med OR mapping??

Jeg arbejder i Asp.net 2.0 med VB.net som motor.

Gælder mig til at høre fra jer.

/Jakob
Avatar billede neoman Novice
19. maj 2007 - 00:58 #2
Først og fremmest, jeg håber du mener 3 tables indenfor samme dataset, fremfor 3 datasets, fordi så kan man udnytte relationerne: vender li tilbage til det.

Jeg selv har tilsvarende relationer som du, men bruger TableAdapters, fordi jeg er relativ nybegynder, mens med typed datasets, så får jeg megameget kode foræret gratis :)


Jeg tror, at man kan lave det samme med normale datasets, så kan lige sige dig hvad der sker hos mig i tilsvarende situation:

TableAdapteren, ved oprettelse, spørger om man ønske at få ID retur, og så laver den selv en insert query efterfulgt af en med scope/identity/Whatever, således at hver gang jeg inserter, så opdaterer den automatisk min tabel med den nye ID fra databasen.


Nu når der er relationer sat op i datatsettet, så er det nemt nok at lave en ny record.

Lad os sige vi har tre tabeller Undersøgelser, Deltagere, Mapping i datasettet

så har du følgende relationer i datasettet :

FK_Undersøgelser_Mappings
FK_Deltagere_Mappings

som gør at hver record i Mappings er en child record af Undersøgelser samt af Deltagere

I mit typed data set foregår det som som følger, når jeg vil have en ny record i Mappings (når datasettet hedder ds)


Dim nyUndersøgelse as UndersøgelserTableRow = ds.Undersøgelser.NewRow
NyUndersøgeselse.DataFelt1 = værdi
NyUndersøgeselse.DataFelt2 = værdi
.
.

ds.Undersøgelser.AddRow(nyUndersøgøelse)

Dim nyDeltager as DeltagerTableRow = ds.Deltagere.NewRow
nyDeltager.DataFelt1 = værdi
nyDeltager.DataFelt2 = værdi
.
.

ds.Deltagere.AddRow(nyDeltager)


Dim nyMapping as MappingTableRow  = ds.Mappings.NewRow
nyMapping.DataFelt1 = værdi
nyMapping.DataFelt2 = værdi
.
.
og her kommer så det sjove, hvor vi udnytter relationerne :

nyMapping.SetParent(nyUndersøgelse)
nyMapping.SetParent(nyDeltager)

og så gemmer vi den

Mappings.AddRow(nyMapping)

Efterfølgende skal parent-tabeller skrives først - især hvis du også har parent-child relationerne også sat op i DB'en

DeltagereTableAdapter(ds.Deltagere).Update
UndersøgelserTableAdapter(ds.Undersøgelser).Update

og herefter

MappingsTableAdapter(ds.Mappings).Update

Eftersom adapterne er sat op til internt at opdatere tabellerne med nye ID fra DB'en,  så vil den nye record i Mappings få de rigtige foreign keys, når tingene foregår i denne rækkefølge.
Du kan selvfølgeligt inserte mange nye records i datatsettet inden du kører med de respektive adapteres update metode - den holder selv styr på den primære nøgle i alle records, takket være relationerne.

Håber ovenstående hjalp lidt .) - og jeg tror du stort set kan implementere den samme fremgangsmåde i dit dataset. Hvis du bruger et typed data set så får du alt dette helt gratis, når du opsætter TAbleAdapters ,og efter at du har defineret relationerne derinde.
Avatar billede flashit Nybegynder
19. maj 2007 - 22:45 #3
Mange tak for svaret, der er helt perfekt.. Prøver det af i morgen :-)
Smider du ikke et svar, så er der P.
Avatar billede flashit Nybegynder
19. maj 2007 - 23:59 #4
Hej Neoman

Kan du ikke lige forklare denne kode:
Dim nyUndersøgelse as UndersøgelserTableRow = ds.Undersøgelser.NewRow

Hvor får du UndersøgelserTableRow fra?, jeg kan nemlig ikke finde noget med en tabelRow nogle steder.

Er det det samme som en tabelTow?

Måske det skal siges at jeg har opretett et dataset, med de 3 datatabels og benytter tabelAdapteren.
Avatar billede neoman Novice
20. maj 2007 - 10:30 #5
Hvis du har oprettet et typed dataset, og de dertil tilhørende TableAdapters, så kan du referere til typerne på følgende vis:

      MitDataSetTableAdapters.DeltagereTableAdapter
      MitDataSetTableAdapters.UndersøgelserTableAdapter
      MitDataSetTableAdapters.MappingsTableAdapter

samt, til tabellerne

  MitDataSet.DeltagereDataTable
  MitDataSet.UndersøgelserDataTable
  MitDataSet.MappingsDataTable

Hvis du importerer de to namespaces

  Imports MitDataSet
  Imports MitDataSetTableAdapters

så har du ting som f.eks.

  UndersøgelserTableRow liggende direkte i din Intellisense!

En UndersøgelserTableRow indeholder de samme data som TableRow - men er strongly typed, så du kan anvende

  Dim nyUndersøgelse as UndersøgelserTableRow = ds.Undersøgelser.NewRow

og derefter

    nyUndersøgelse.DataFeltBlaah

mens hvis du siger:

  Dim nyUndersøgelse as DataRow = ds.Undersøgelser.NewRow (som jeg tror vil virke, men har ikke prøvet, fordi det er lissom at smide barnet ud med badevandet:)

så skal du referere til indholdet "the old-fashioned way":

  nyUndersøgelse("DataFelt1") = værdi

I øvrigt lavede jeg en fejl i mit forrige eksempel. At markere hvilken række er parent row hedder : nyMapping.SetParentRow(nyDeltager) - men alle de ting ligger faktisk i Intellisense.

Efter at have opdaget typed datasets og TableAdapters så har jeg flyttet 100 % over på dem, og synes det er verdens bedste opfindelse efter den dybe tallerken :)
Avatar billede neoman Novice
20. maj 2007 - 10:30 #6
og det var et svar
Avatar billede neoman Novice
20. maj 2007 - 10:36 #7
og en sidste bemærkning - når du opretter relationerne i designeren, så lad det sidste felt -  Accept/Reject rule -  stå på den default værdi som den selv kommer med : None!!!!

Hvis man piller der, så får man problemer med opdatering af FK i child rows samt i det hele taget med at gemme dem, når  man prøver at gemme tabellerne i Db'en !
Avatar billede flashit Nybegynder
06. juni 2007 - 11:34 #8
Hej neoman

Jeg kan vel ikke logge dig til at sende et test projekt, som gør det du skriver? Jeg kan nemlig ikke finde ud af det... Sorry.
Bare Datasettet og klassen som benytter den.

jakob(a)dotdk.dk, hvis det er ok.

Mvh
Jakob
Avatar billede neoman Novice
06. juni 2007 - 11:42 #9
har ikke noget liggende som sådan desværre - hvis du har et specifikt problem, så prøv mig på skype: petercph
Avatar billede neoman Novice
06. juni 2007 - 23:32 #10
Nå ikke. Anyways - hvad er problemet ? Skriv det bare her - der er nogle få fælder, men det skulle ikke tage meget at rette op. Skriv hvor langt du er kommet , og hvad det er du har problemer med.
Avatar billede flashit Nybegynder
06. juni 2007 - 23:43 #11
Er der en anden måde jeg kan kontakte dig end Skype, jeg har det nemlig ikke.
Avatar billede flashit Nybegynder
06. juni 2007 - 23:44 #12
og tak fordi du stadig gider hjælpe. jeg vil meget gerne finde fidusen. Den "gamle" måde er for kedelig ;-)
Avatar billede neoman Novice
07. juni 2007 - 00:33 #13
Få skype - det er jo gratis ... eller bare skriv hér.
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