18. maj 2007 - 22:42Der 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
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??
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 :
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.
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 :)
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 !
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.
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.
Få skype - det er jo gratis ... eller bare skriv hér.
Synes godt om
Ny brugerNybegynder
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.