Avatar billede kpjensendk Nybegynder
19. marts 2009 - 14:37 Der er 16 kommentarer

Indsæt data i 2 tables i db samtidig ?

Hej.

Jeg er i gang med en opgave hvor jeg skal oprette en tråd i min forum.

og jeg har 2 tables i databasen som der skal indsættes i.

nummer 1 er:

Trade:
id
titel
fk_kategorierID

nummer 2 er:

Poster:
id
dato
besked
fk_brugerID
fk_tradeID


I den første table der skal der indsættes et id som bliver sat automatisk ind, også en titel som hentes fra en textbox og en fk_kategorierID som bliver hentet fra en dropdown liste og dette virker.

Men samtidig skal der oprettes i table 2 "poster" her skal den oprette id som den også gør automatisk, derefter en dato som også er på plads og en besked som hentes fra textbox, og min fk_brugerID henter jeg fra min session der er sat.

men så kommer mit problem, jeg skal også have sat fk_tradeID ind i tablen men det er det id som der kommer fra table1"trade"´s id . og da jeg har lavet det hele i samme sql sætning ved jeg ikke hvordan jeg kan hente dette...
Ved ikke om det er muligt så håber jeg kan få nogen svar fra jer, Det er det sidste jeg mangler for at min tråd kan oprettes med den rette post knyttet til.

jeg giver her et eksempel på min kode som den ser ud nu.

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = "INSERT INTO Trade (titel, fk_kategorierID)VALUES(@titel, @fk_kategorierID)";
        cmd.CommandText = "INSERT INTO Poster (dato, besked, fk_brugerID, fk_readeID)VALUES(@dato, @besked, @fk_brugerID, @fk_tradeID)";



        cmd.Parameters.Add(new SqlParameter("@titel", TextBox_opret_traad.Text));
        cmd.Parameters.Add(new SqlParameter("@fk_kategorierID", DropDownList_opret_traad.SelectedValue));
        cmd.Parameters.Add(new SqlParameter("@besked", TextBox_trad_besked.Text));
        cmd.Parameters.Add(new SqlParameter("@fk_brugerID", Session["brugerID"]));
        cmd.Parameters.Add(new SqlParameter("@dato", DateTime.Now.ToString("dddd") + DateTime.Now.ToString("D")));

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
Avatar billede arne_v Ekspert
19. marts 2009 - 14:42 #1
cmd.CommandText = "INSERT INTO Poster (dato, besked, fk_brugerID, fk_readeID)VALUES(@dato, @besked, @fk_brugerID, @fk_tradeID)";

->

        cmd.CommandText = "INSERT INTO Poster (dato, besked, fk_brugerID, fk_readeID)VALUES(@dato, @besked, @fk_brugerID, LAST_INSERT_ID())";
Avatar billede arne_v Ekspert
19. marts 2009 - 14:44 #2
hov det er SQLServer ikke MySQL !

        cmd.CommandText = "INSERT INTO Poster (dato, besked, fk_brugerID, fk_readeID)VALUES(@dato, @besked, @fk_brugerID, SCOPE_IDENTITY())";
Avatar billede kpjensendk Nybegynder
19. marts 2009 - 15:03 #3
sorry men er ikke helt sikker på hvad du mener jeg skal gøre....
Avatar billede kpjensendk Nybegynder
19. marts 2009 - 15:06 #4
Hvad skal jeg så skrive nede i mit parameter hvis jeg skriver det på den der måde ?
Avatar billede arne_v Ekspert
19. marts 2009 - 22:03 #5
Som jeg skrev.

Og der skal ikke angives nogen parameter.
Avatar billede kpjensendk Nybegynder
19. marts 2009 - 23:28 #6
"INSERT INTO Poster (dato, besked, fk_brugerID, fk_tradeID)VALUES(@dato, @besked, @fk_brugerID, SCOPE_IDENTITY())";

når jeg gør dette kommer den med en fejl og siger min table ikke alowed nulls... så den funktion henter ingen ting.
Avatar billede arne_v Ekspert
19. marts 2009 - 23:33 #7
Nu kigger jeg lige lidt mere på din kode.

Får du executed den første INSERT ?

Det er INSERT af en identity som gør at SCOPE_IDENTITY() får en værdi.
Avatar billede kpjensendk Nybegynder
19. marts 2009 - 23:38 #8
Som du kan se i min kode i tråde den første del. det er hvad jeg har i min sql sætning også har jeg bare tilføjet det du skrev i min insert linje nummer 2 . andet har jeg ikke gjort.
Avatar billede arne_v Ekspert
19. marts 2009 - 23:42 #9
Lad os lige rearangere lidt:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO Trade (titel, fk_kategorierID)VALUES(@titel, @fk_kategorierID)";
cmd.Parameters.Add(new SqlParameter("@titel", TextBox_opret_traad.Text));
cmd.Parameters.Add(new SqlParameter("@fk_kategorierID", DropDownList_opret_traad.SelectedValue));
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO Poster (dato, besked, fk_brugerID, fk_readeID)VALUES(@dato, @besked, @fk_brugerID, SCOPE_IDENTITY())";
cmd.Parameters.Add(new SqlParameter("@besked", TextBox_trad_besked.Text));
cmd.Parameters.Add(new SqlParameter("@fk_brugerID", Session["brugerID"]));
cmd.Parameters.Add(new SqlParameter("@dato", DateTime.Now.ToString("dddd") + DateTime.Now.ToString("D")));
cmd.ExecuteNonQuery();
conn.Close();
Avatar billede kpjensendk Nybegynder
19. marts 2009 - 23:50 #10
når jeg indsætter dette kommer jeg frem til samme problem nemlig at fejlmeddelelsen siger:

column does not allow nulls. INSERT fails.
The statement has been terminated.
Avatar billede arne_v Ekspert
20. marts 2009 - 00:10 #11
Og Trade.id er identity ?
Avatar billede arne_v Ekspert
20. marts 2009 - 00:11 #12
cmd.Parameters.Add(new SqlParameter("@dato", DateTime.Now.ToString("dddd") + DateTime.Now.ToString("D")));

må iøvrigt kunne laves som:

cmd.Parameters.Add(new SqlParameter("@dato", DateTime.Now));
Avatar billede kpjensendk Nybegynder
20. marts 2009 - 07:57 #13
Ja rigtigt nok...

jeg har skrevet det præcis på samme måde som det du skrev i forrige tråd...
Avatar billede teepee Nybegynder
20. marts 2009 - 09:00 #14
Ville det ikke være lettere at foretage et enkelt procedure-kald og lade logikken omkring opretning af tråde ligge der? Så sikrer du også at de to inserts kan ligge i samme transaction.
Avatar billede kpjensendk Nybegynder
20. marts 2009 - 09:06 #15
cmd.CommandText = "INSERT INTO Trade (titel, fk_kategorierID)VALUES(@titel, @fk_kategorierID);SELECT @@IDENTITY";
        cmd.Parameters.Add(new SqlParameter("@titel", TextBox_opret_traad.Text));
        cmd.Parameters.Add(new SqlParameter("@fk_kategorierID", DropDownList_opret_traad.SelectedValue));
        object tradid = cmd.ExecuteScalar();
        cmd.CommandText = "INSERT INTO Poster (dato, besked, fk_brugerID, fk_tradeID)VALUES(@dato, @besked, @fk_brugerID, @fk_tradeID)";
        cmd.Parameters.Add(new SqlParameter("@besked", TextBox_trad_besked.Text));
        cmd.Parameters.Add(new SqlParameter("@fk_brugerID", Session["brugerID"]));
        cmd.Parameters.Add(new SqlParameter("@dato", DateTime.Now.ToString("dddd") + DateTime.Now.ToString("D")));
        cmd.Parameters.Add(new SqlParameter("@fk_tradeID", tradid.ToString()));
        cmd.ExecuteNonQuery();
        conn.Close();
        Response.Redirect("bruger.aspx");

Sådan lavede jeg koden og fik det til at virke.
Avatar billede arne_v Ekspert
22. marts 2009 - 00:56 #16
SCOPE_IDENTITY() gør det samme som @@IDENTITY bare bedre

og der burde ikke være nogen grund til at hive den ud fra DB til app og tilbage igen.
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
Computerworld tilbyder specialiserede kurser i database-management

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