Avatar billede pnr Nybegynder
08. april 2005 - 13:32 Der er 14 kommentarer og
1 løsning

Hjælp til oprettelse af post med dynamiske specifikationer

Jeg skal have oprettet en kategori i databasen, denne post består af nogle faste informationer og nogle dynamiske informationer eks.

Faste informationer
ID
Navn
Hovedkategori

Dynamiske informationer
Længde
Dybde
Vægt

De faste informationer ligges i en tabel og de dynamisk informationer oprettes enkeltvis i en anden tabel. Men hvordan gøres det smartest rent praktisk. Den eneste måde jeg ved at jeg kan lave det på er ved først at tilgå databasen for at oprette de fasteinformation, derefter løbe alle de dynamiske informationer igennem og oprette dem enkeltvis i databasen. Men kan det ikke laves smartere, og hvis ja hvordan?
Avatar billede a1a1 Novice
08. april 2005 - 14:21 #1
hvis det kun er 3 dynamiske poster ville jeg da bare ligge dem i samme tabel og udfylde dem hvis der er noget, men du er nok ude efter mange...

ellers kan du gøre noget ala dette...

insert i første tabel, få nyt id
der efter kan du så, sætte noget ind i den næste ala
if dynamiskeposter then
insert i anden tabel
end if
eller gøre noget forskelligt udfra f.eks. hovedkategori
Avatar billede pnr Nybegynder
08. april 2005 - 14:35 #2
Det du har skrevt svare til det jeg kunne komme på, dvs. en masse tilgang til databasen. Det jeg fiskede efter var om der rent performance mæssigt var en bedre måde at gøre det på, så jeg kun skulle tilgå databasen en eller 2 gange?
Avatar billede a1a1 Novice
08. april 2005 - 14:46 #3
hvis du bruger ms sql kan du lave en storedprocedure, der gør det for dig
Avatar billede pnr Nybegynder
08. april 2005 - 15:20 #4
Jeg bruger MS SQL, men hvordan laver jeg en storedprocedure der kan modtage x antal dynamiske informationer?
Avatar billede a1a1 Novice
08. april 2005 - 15:34 #5
tja, det kommer jo lidt an på hvordan datahænger sammen, evt. noget ala.

create proc insertproduct
@name varchar(30),
@category int,
@value1 NULL,
@value2 NULL

AS
insert into tabel (name, categoryid) values ('a',1)
if categoryid = 1
begin

if not @value1 is null
begin
insert into tabel2 (name) values (@value1)
end

end
else if categoryid = 2
begin

if not is @value1 null and not @value2
begin
insert into tabel3 (name,othername) values (@value1@value2)
end

end

GO
Avatar billede pnr Nybegynder
08. april 2005 - 15:44 #6
Ja men jeg aner jo ikke hvor mange value1, value2 ..... Jeg skal have, det er brugerne af systemet der oprette disse.
Avatar billede burningice Nybegynder
09. april 2005 - 10:08 #7
det kan ikke laves meget smartere end hvad du skitserede i dit oprindelige spørgsmål

1) opret et produkt, og få fat i dens id
2) indsæt de ekstra informationer i din relationstabel med id'et fra 1) som reference

hvor du holder forbindelsen åben mellem 1) og 2) er det altså ikke noget der betyder noget rent perfomance-mæssigt
Avatar billede pnr Nybegynder
09. april 2005 - 10:34 #8
Med hensyn til step 2 vi der jo også blive x antal tilgange til databasen. eks

INSERT INTO dynInfo (rel, info, type) VALUES (1,'længde',2)
INSERT INTO dynInfo (rel, info, type) VALUES (1,'dybde',2)
INSERT INTO dynInfo (rel, info, type) VALUES (1,'vægt',2)

OSV.
Kan man indsætte alle dem på en gang, eller skal det også gøres x antalgange?
Avatar billede burningice Nybegynder
09. april 2005 - 10:49 #9
det skal gøre x antal gange... men som sagt, det er ikke noget problem rent performance-mæssigt

public class DynInf {
    public string Key;
    public int Value;
}
public void insertDynamicInformation(int id, DynInf[] infos) {

  SqlConnection conn = new SqlConnection();
  SqlCommand comm = new SqlCommand();
  comm.Connection = conn;
  conn.Open();

  for (int i = 0; i < infos.Length; i++) {
      comm.Query = "INSERT INTO dynInfo (rel, info, type) VALUES ("+ id +", '"+ infos[i].Key +"', "+ infos[i].Value +")";
      comm.ExecuteNonQuery();
  }

  conn.Close();
}


DynInfo[] infos = new DynInfo[3];

infos[0].Key = "Længde";
infos[0].Value = 2;

infos[1].Key = "Dybde";
infos[1].Value = 2;

infos[2].Key = "Vægt";
infos[2].Value = 2;

insertDynamicInformation(1, infos);
Avatar billede pnr Nybegynder
11. april 2005 - 10:04 #10
Er der nogen speciel grund til at jeg ikke kan gøre det på følgende måde:

  SqlConnection conn = new SqlConnection();
  SqlCommand comm = new SqlCommand();
  comm.Connection = conn;
  conn.Open();

comm.Query = "INSERT INTO dynInfo (rel, info, type) VALUES (1,'længde',2);
INSERT INTO dynInfo (rel, info, type) VALUES (1,'dybde',2);
INSERT INTO dynInfo (rel, info, type) VALUES (1,'vægt',2)"

comm.ExecuteNonQuery();
conn.Close();

Så har jeg vel kun 2 tilgange til databasen, 1 for at oprette de faste informationer, og en for at oprette alle de dynamiske informationer.
Avatar billede burningice Nybegynder
11. april 2005 - 16:23 #11
well, hvis det virker det det helt fint. jeg vidste bare ikke at SqlCommand understøttede multiple commands på den måde.
Avatar billede pnr Nybegynder
13. april 2005 - 09:18 #12
Tak for hjælpen til jer begge.

cyberfessor smid et svar så er der lidt point for dine kommentare


Lige en sidste ting:
cybderfessor du skriver at database adgang ikke er noget problem performance-mæssigt, men bør man ikke altid minimere tilgang til databasen mest muligt?
Avatar billede burningice Nybegynder
13. april 2005 - 10:19 #13
jo, men vi snakker jo her om 2 eller 4 queries på den samme connection, en optimering med faktor 2 Hvis vi nu havde snakket om en faktor 5 eller 10 var det nok en anden sag. Og nu hvor MSSQL understøtter Connection Pooling er det endnu mindre kritisk.

Selvfølgelig skal man ikke frådse om sig med queries, men i dette scenarie er det måske en forringelse på 1 ms. Og hvis databasen endda ligger på samme maskine kan det være endnu lavere.

Der er så mange andre ting i en webapplikation der er større flaskehalse end et scenario som dette.
Avatar billede burningice Nybegynder
13. april 2005 - 10:19 #14
.
Avatar billede pnr Nybegynder
13. april 2005 - 11:00 #15
Mange tak for informationen!
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