Avatar billede c-sharp Nybegynder
24. januar 2005 - 12:00 Der 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?
Avatar billede arne_v Ekspert
24. januar 2005 - 12:04 #1
Jeg er ikke helt sikker på at jeg kan se pointen i din første del.

Jeg vil umidelbart formode at det er de samme personer som:
  - har adgang til .aspx filerne
  - kender database username/password
Avatar billede arne_v Ekspert
24. januar 2005 - 12:05 #2
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
Avatar billede c-sharp Nybegynder
24. januar 2005 - 13:05 #3
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:

Salg
Svend
Kurt
rene

Kontor
Gurli
arne_v

OSV.
Avatar billede arne_v Ekspert
24. januar 2005 - 13:15 #4
SELECT afdelinger.navn,medarbejder.navn
FROM medarbejder,afdelinger
WHERE medarbejder.afdeling_id=afdelinger.id
ORDER BY afdelinger.navn

og så lidt smart formatering
Avatar billede c-sharp Nybegynder
24. januar 2005 - 13:26 #5
Det var mere hvordan jeg styrre det i min udskrift i repeateren?
Avatar billede arne_v Ekspert
24. januar 2005 - 13:30 #6
Det ligger ud over hvad jeg kan.

Der skal du have fat på snepnet eller cyberfessor eller en af de andre
Avatar billede segato Nybegynder
24. januar 2005 - 16:01 #7
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?
Avatar billede arne_v Ekspert
24. januar 2005 - 21:30 #8
Data Access Layer er vel altid godt.

Men web service og COM+ er vist kun relevant ved løsninger af en vis størrelse.
Avatar billede c-sharp Nybegynder
25. januar 2005 - 07:49 #9
Nå men så lad os da gøre det kapittel færdig :-)

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!
Avatar billede burningice Nybegynder
25. januar 2005 - 12:49 #10
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

på klienten bruger du nested repeaters til at rendere dit output. Der findes masser artikler omkring det på nettet: http://www.google.com/search?q=nested+repeaters&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:en-US:official
Avatar billede c-sharp Nybegynder
26. januar 2005 - 09:23 #11
Jeg er lidt i tvivl om hvordan jeg henter 2 tabeller ind i et dataset, jeg har prøvet følgnede:

string sql1 = "SELECT afdeling, indexnr FROM tblAfdelinger";
string sql2 = "select titel, navn, tlf, andet, email, medarbejdernr, billede, afdeling from tblMedarbejder ";

DataSet ds1 = SqlHelper.ExecuteDataset(connStr, CommandType.Text, sql1);
ds1 = SqlHelper.ExecuteDataset(connStr, CommandType.Text, sql2);

>>>>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.
Avatar billede burningice Nybegynder
26. januar 2005 - 12:30 #12
MS Data Blocks... :) can be a pain in the ass sometimes

... problemet er at du overskriver det første DataSet med det andet...

Er der ikke en ExecuteTable-metode i stedet?

Ellers må du krybe til stenen og gøre det på den hårde måde:

DataSet theDataSet = SqlHelper.ExecuteDataset(connStr, CommandType.Text, sql1);
DataSet tmpDs = SqlHelper.ExecuteDataset(connStr, CommandType.Text, sql2);

theDataSet.Tables.Add(tmpDs.Tables["tblMedarbejder"]);
theDataSet.Relations.Add("rel", theDataSet.Tables["tblAfdelinger"].Columns["indexnr"], theDataSet.Tables["tblMedarbejder"].Columns["afdeling"]);
Avatar billede c-sharp Nybegynder
27. januar 2005 - 15:28 #13
Hvordan bliver hver kolonne navngivet? Jeg har det problem at jeg kun kan få data ud af dataset'et ved at skrive følgende:

Repeater1.DataSource = ds1.Tables["Table"].DefaultView;

Skriver jeg:

Repeater1.DataSource = ds1.Tables["tblMedarbejder"].DefaultView;

Får jeg fejlen: Objektreferencen er ikke indstillet til en forekomst af et objekt.
Avatar billede burningice Nybegynder
27. januar 2005 - 16:00 #14
Aner det ikke.. jeg har aldrig rodet alverdens med dataset, og de gange har der kun ligget en tabel i den, så jeg har kunne bruge 0 som index.

Der er forresten en fejl i min .Columns. Den er baseret på dobbeltindex:

theDataSet.Tables.Add(tmpDs.Tables["tblMedarbejder"]);
theDataSet.Relations.Add("rel", theDataSet.Tables["tblAfdelinger"]["indexnr"], theDataSet.Tables["tblMedarbejder"]["afdeling"]);
Avatar billede c-sharp Nybegynder
01. februar 2005 - 11:04 #15
Hvis jeg skriver det som du har skrevet det får jeg følgende fejl:

Cannot apply indexing with [] to an expression of type 'System.Data.DataTable'
Avatar billede burningice Nybegynder
01. februar 2005 - 18:11 #16
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);
Avatar billede c-sharp Nybegynder
02. februar 2005 - 10:21 #17
Det bliver ved med at drille :~/

Nu får jeg fejlen: System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.

Jeg fatter ikke hvorfor at jeg ikke kan få data ud af det dataset når jeg tilgår det med tabel navnet istedet for bare at skrive "Table"
Avatar billede burningice Nybegynder
04. februar 2005 - 11:46 #18
prøv at lav en løkkke der skriver navnene på alle dine tabeller ud.

foreach (Table t in ds.Tables) {
  Response.Write(t.Name);
}
Avatar billede c-sharp Nybegynder
16. februar 2005 - 10:11 #19
Hvis jeg skriver det du har skrevet får jeg følgende fejl:

'System.Web.UI.WebControls.Table' does not contain a definition for 'Name'
Avatar billede burningice Nybegynder
16. februar 2005 - 10:19 #20
:) der er vist sket noget navnerod

foreach (System.Data.DataTable t in ds.Tables) {
  Response.Write(t.Name);
}
Avatar billede c-sharp Nybegynder
10. marts 2005 - 15:50 #21
Du må meget undskylde at dette trækker i langdrag!!
Jeg har prøvet at skrive følgende for at finde ud af om der er data i dataset'et:

Response.Write(ds1.GetXml());

Og den udskriver fint de data der skulle være.
Avatar billede burningice Nybegynder
10. marts 2005 - 15:58 #22
og tabellerne har de navne som du forventer de skal have?
Avatar billede c-sharp Nybegynder
11. marts 2005 - 06:04 #23
Nej tabellen hedder ikke det samme som den hedder i databasen.

<NewDataSet>
  <Table>
    <afdeling>Salg</afdeling>
    <indexnr>2</indexnr>
  </Table>
  <Table>
    <afdeling>Kontor</afdeling>
    <indexnr>3</indexnr>
  </Table>
  <Table>
    <afdeling>Værksted</afdeling>
    <indexnr>4</indexnr>
  </Table>
</NewDataSet>
Avatar billede burningice Nybegynder
11. marts 2005 - 09:23 #24
der er jo også kun en tabel?
Avatar billede c-sharp Nybegynder
11. marts 2005 - 09:37 #25
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?
Avatar billede burningice Nybegynder
11. marts 2005 - 09:49 #26
jeg tror det er en begrænsning MS Data Blocks. Finten er at oprette et dataset selv og tilføje de enkelte tabeller på denne måde:

DataSet ds = new DataSet();
DataTable enTabel = new DataTable("en tabel");
DataTable enAndenTabel = new DataTable("en anden tabel");

// database-gejl der opretter en adapter til >enTabel<
dataAdapter1.Fill(enTabel);

// database-gejl der opretter en adapter til >enAndenTabel<
dataAdapter2.Fill(enAndenTabel);


Du har nu et dataset med to tabeller der er navngivet
Avatar billede c-sharp Nybegynder
14. marts 2005 - 06:28 #27
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?
Avatar billede burningice Nybegynder
14. marts 2005 - 22:49 #28
ja... de to tabeller kan nemt tilføjes til datasettet på denne måde:

ds.Tables.Add(enTabel);
ds.Tables.Add(enAndenTabel);

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.
Avatar billede c-sharp Nybegynder
16. marts 2005 - 10:20 #29
Så fik jeg det langt omlænge til at virke :-)

cyberfessor du skal have tusind tak for din tålmodighed og din hjælp!! smid et svar så er det velfortjente point!

Lige en lille ting mere kan du evt. hjælpe mig her http://www.eksperten.dk/spm/596432
Avatar billede burningice Nybegynder
16. marts 2005 - 14:27 #30
det var da dejligt :)
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