24. januar 2005 - 12:00Der er
29 kommentarer og 1 løsning
Lave central database adgang
Jeg har lavet et lille cms-system hvor der er et centralt styrepanel hvor man kan opdatere sin hjemmeside. På selve hjememsiderne går jeg så direkte i databasen. Dette synes jeg ikke er optimal da kunden så kan se database adgangen (brugernavn og password). Derfor tænkte jeg på om det ikke var smart at lave en webservices hvor man kunne henvende sig med hvilket modul man ønsker data til, og en adgangskode så ikke alle kan så data?
Min plan er så et denne webservices skal retunere et dataset med data til det ønskede modul. Problemet er at der er et medarbejdermodul hvor alle medarbejdere er listet under de afdelinger de høre under. Det er idag lavet ved først at få alle afdelingerne fra databasen, og derefter sprøge databasen efter medarbejderen for hver afdeling (Dette forgår fra repeateren). Kunne dette evt. pakkes ind i et dataset?
Med hensyn til det andet så giver det næsten altid bedre performance med 1 query med en JOIN fremfor 1 query til enkelt tabel + X queryes for til en tabel for hver række fra første query
Ja men hvordan skal det skal det så skrues sammen hvis jeg har en tabel med afdelinger, en tabel med medarbejder, og jeg ønsker at liste disse på følgend måde:
Det er altid god praksis at lave et Data Acces Layer hvor alt kommunikation går igennem. Og du gør det via en webservice eller COM+ komponent det kommer an på opgaven.
Med hensyn til DataSet kan du jo bare joine de to tabeller?
De folk der har en sådan løsning har adgang til webhotellet, men de har ikke adgang til Sql-serveren. Den adgang de bruger er den samme som de andre der bruger CMS systemet. Derfor vil jeg fjerne den direkte databaseadgang fra selv koden. Så vil jeg bruge den adgangskode de bruger til at logge på systemet, til at give dem deres data via en webservices.
Men jeg mangler stadig en løsning på mit problem med repeateren og så at liste medarbejderne!
det er ikke svært at lave ovenstående rendering med en repeater. Tricket hedder Nested Repeaters, og den nemmeste måde man kan gøre det på er at have to tabeller i et dataset der har en indbyrdes relation.
At få det til at virke i et scenario som dit kræver bare at du i webservicen har en procedure der sender et sådan dataset retur. Altså...
1) hent hele medarbejder-tabellen ind i et dataset 2) hent hele afdelinger-tabellen ind i samme dataset 3) lav en relation mellem medarbejder.afdeling_id og afdelinger.id 4) send datasettet retur til klienten
>>>>ds1.Relations.Add("rel", ds1.Tables["tblAfdelinger"].Columns["indexnr"],ds1.Tables["tblMedarbejder"].Columns["afdeling"]);<<<<< //Denne linie siger den at der er fejl!
Men får følgende fejl:
System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.
det var da også utrolig som jeg tåger rundt i det...
det første eksempel jeg kom med var rigtig nok. Her er lidt kode taget fra MSDN'en
System.Data.DataRelation dr; System.Data.DataColumn dc1; System.Data.DataColumn dc2; // Get the parent and child columns of the two tables. dc1 = ds.Tables["Suppliers"].Columns["SupplierID"]; dc2 = ds.Tables["Products"].Columns["SupplierID"]; dr = new System.Data.DataRelation("suppliers2products", dc1, dc2); ds.Relations.Add(dr);
Problemet er at hvergang jeg henter data i databasen bliver de retuneret som "tabellen" Table, dvsnu har jeg to dataset der begge har data til at ligge i en tabel der hedder Table. Hvorfor ligger de ikke i en tabel af samme navn som den de kommer fra i databasen?
Jeg er godt nok ked af at jeg skal trække det her spørgsmål sådan i langdrag, men jeg er utrolig glad for at du ikke har givet op endnu :-)
Den kode du lige har posted kan jeg ikke helt se sammenhængen i, jeg går ud fra at når du skriver "DataTable enTabel = new DataTable("en tabel")" oprette du en tabel men denne skal vel oprettes i dataset'et, eller hvad?
Og hvad med de adaptere du så opretter hvad gør de?
Datatadapterne sørger bare for at hente fra din database og kopierer dataerne over i en datatable med så alle rækker og kulonner matcher dem i databasen. Det er også det SqlHelper.ExecuteDataset-metoden gør i baggrunden for at returnere dig et dataset. Den har dog problemer med flere tabeller og navngivning af dem :( Og på grund af det må vi ind og gøre det manuelt.
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.