Adăugați rândul în baza de date, obțineți id și umpleți masa secundară

Nu sunt mare la .NET dar învăț (cel puțin încercând să!;)). Totuși, acest pic de cod pe care-l lucrez ma înșelat. Ceea ce vreau să fac este să introduc un rând într-un tabel de baze de date SQL Server 2008 numit Comment , apoi să folosiți idul acestui rând inserat pentru a popula un al doilea tabel ( CommentOtherAuthor ) noi rânduri de date. Practic, un comentariu poate avea mai mulți autori.

Iată codul:

public static Comment MakeNew(int parentNodeId, string firstname, string surname, string occupation, string affiliation, string title, string email, bool publishemail, bool competinginterests, string competingintereststext, string[] otherfirstname, string[] othersurname, string[] otheroccupation, string[] otheraffiliation, string[] otheremail, bool approved, bool spam, DateTime created, string commentText, int statusId)
{
        var c = new Comment
            {
                ParentNodeId = parentNodeId,
                FirstName = firstname,
                Surname = surname,
                Occupation = occupation,
                Affiliation = affiliation,
                Title = title,
                Email = email,
                PublishEmail = publishemail,
                CompetingInterests = competinginterests,
                CompetingInterestsText = competingintereststext,
                OtherFirstName = otherfirstname,
                OtherSurname = othersurname,
                OtherOccupation = otheroccupation,
                OtherAffiliation = otheraffiliation,
                OtherEmail = otheremail,
                Approved = approved,
                Spam = spam,
                Created = created,
                CommenText = commentText,
                StatusId = statusId
            };

        var sqlHelper = DataLayerHelper.CreateSqlHelper(umbraco.GlobalSettings.DbDSN);

        c.Id = sqlHelper.ExecuteScalar(
            @"insert into Comment(mainid,nodeid,firstname,surname,occupation,affiliation,title,email,publishemail,competinginterests,competingintereststext,comment,approved,spam,created,statusid) 
                values(@mainid,@nodeid,@firstname,@surname,@occupation,@affiliation,@title,@email,@publishemail,@competinginterests,@competingintereststext,@comment,@approved,@spam,@created,@statusid)",
            sqlHelper.CreateParameter("@mainid", -1),
            sqlHelper.CreateParameter("@nodeid", c.ParentNodeId),
            sqlHelper.CreateParameter("@firstname", c.FirstName),
            sqlHelper.CreateParameter("@surname", c.Surname),
            sqlHelper.CreateParameter("@occupation", c.Occupation),
            sqlHelper.CreateParameter("@affiliation", c.Affiliation),
            sqlHelper.CreateParameter("@title", c.Title),
            sqlHelper.CreateParameter("@email", c.Email),
            sqlHelper.CreateParameter("@publishemail", c.PublishEmail),
            sqlHelper.CreateParameter("@competinginterests", c.CompetingInterests),
            sqlHelper.CreateParameter("@competingintereststext", c.CompetingInterestsText),
            sqlHelper.CreateParameter("@comment", c.CommenText),
            sqlHelper.CreateParameter("@approved", c.Approved),
            sqlHelper.CreateParameter("@spam", c.Spam),
            sqlHelper.CreateParameter("@created", c.Created),
            sqlHelper.CreateParameter("@statusid", c.StatusId));

        c.OnCommentCreated(EventArgs.Empty);

        for (int x = 0; x < otherfirstname.Length; x++)
        {
            sqlHelper.ExecuteScalar(
                @"insert into CommentOtherAuthor(firstname,surname,occupation,affiliation,email,commentid) values(@firstname,@surname,@occupation,@affiliation,@email,@commentid)",
                sqlHelper.CreateParameter("@firstname", otherfirstname[x]),
                sqlHelper.CreateParameter("@surname", othersurname[x]),
                sqlHelper.CreateParameter("@occupation", otheroccupation[x]),
                sqlHelper.CreateParameter("@affiliation", otheraffiliation[x]),
                sqlHelper.CreateParameter("@email", otheremail[x]),
                sqlHelper.CreateParameter("@commentid", 123)
            );
        }

        if (c.Spam)
        {
            c.OnCommentSpam(EventArgs.Empty);
        }

        if (c.Approved)
        {
            c.OnCommentApproved(EventArgs.Empty);
        }

        return c;
    }

Linia cheie este:

sqlHelper.CreateParameter("@commentid", 123)

În momentul de față, codifică codul de identificare a codului ca fiind 123, dar într-adevăr am nevoie ca acesta să fie id-ul înregistrării introduse doar în tabelul de comentarii.

Eu chiar nu înțeleg cum să apuc ultima inserare din tabelul de comentariu fără a face un nou

SELECT TOP 1 id FROM Comment ORDER BY id DESC

care nu mă consideră cel mai bun mod de a face acest lucru.

Poate cineva să sugereze cum să obțineți acest lucru?

Mulţumesc mult!

0

2 răspunsuri

Această interogare SELECT TOP 1 id ... cel mai probabil nu vă va da rezultatele potrivite oricum într-un sistem sub sarcină. Dacă aveți 20 sau 50 de clienți care inserează comentarii în același timp, până când veți interoga din nou tabelul, sunt foarte mari probabilitatea de a primi codul id al altcuiva ...

Cea mai bună modalitate de a face acest lucru ar fi:

  • add an OUTPUT clause to your original insert and capture the newly inserted ID
  • use that ID for your second insert

Ceva în felul următor:

c.Id = sqlHelper.ExecuteScalar(
        @"insert into Comment(......) 
          output Inserted.ID                
          values(.............)",

Folosind această abordare, valoarea dvs. c.Id ar trebui să fie nou introdusă ID - utilizați în următoarea instrucțiune insert! ( notă: acum, probabil că întotdeauna obțineți un 1 înapoi - numărul de rânduri afectate de declarația dvs. ... )

Această abordare presupune că tabelul dvs. Comment are o coloană de tip INT IDENTITY care va fi setată automat când introduceți un nou rând în el.

for (int x = 0; x < otherfirstname.Length; x++)
{
        sqlHelper.ExecuteScalar(
            @"insert into CommentOtherAuthor(.....) values(.....)",
            sqlHelper.CreateParameter("@firstname", otherfirstname[x]),
            sqlHelper.CreateParameter("@surname", othersurname[x]),
            sqlHelper.CreateParameter("@occupation", otheroccupation[x]),
            sqlHelper.CreateParameter("@affiliation", otheraffiliation[x]),
            sqlHelper.CreateParameter("@email", otheremail[x]),
            sqlHelper.CreateParameter("@commentid", c.Id)  <<=== use that value you got back!
        );
}
0
adăugat

Presupunând că utilizați Microsoft SQL Server, aveți posibilitatea să proiectați tabelul Comentariu astfel încât coloana Id să aibă valoarea Identitatea setată la true. În acest fel, baza de date va genera și va crește automat idul de fiecare dată când un rând este introdus în tabel.

Va trebui să utilizați următoarea linie în cererea SQL:

OUTPUT INSERTED.Id

pentru a returna acest Id la codul C# atunci când cererea este executată.

0
adăugat