Skrivet av KeVVa:
Lagrade procedurer är bättre och säkrare sätt använda än vanliga insert. Dels så kan man innan det sparas till tabell formatera om data och man kan också kontrollera data innan det lagras.
Har du ingen främmande nyckel mellan dina tabeller? Isf kan du använda den och göra en join.
För att ta bort en rad ifrån flera tabeller kan du använda lagrade procedurer eller krångla till det med manuella transaktioner.
Men som sagt, en främmande nyckel tror jag är din lösning.
(Personer)
_Id | FNamn | ENamn
1 | Nomen | Notetur
(Bilar)
_id | modell | tillverkare | PId (ägare)
1 | Lorem | Ipsum | 1
Id är två primära nycklar för respektive tabell och PId är en främmande nyckel med relation till Personer.Id
Då kan du köra två delete from i en procedur på personer.id!
Edit: får att få det till en hemsida så får du göra om ditt projekt till ett ASP.NET projekt!
Jag ska försöka förklara min applikation tydligare så ni får en bättre bild på hur den ser ut.
Först skapade jag två Tabeller i databasen: Märke och Produkt
Märke
-ID (Primärnycker) UNIQUEIDENTIFIER
-Märke NCHAR
-Varunummer NVARCHAR
Produkt
-ID (Primärnyckel) UNIQUEIDENTIFIER
-Namn NCHAR
-Antal INT
-MärkeID (Främmande nyckel) UNIQUEIDENTIFIER
Därefter skapade jag en lagrad procedur som såg till att man kunde lägga till data i tabellerna.
Lagrad procedur AddMärkeAndProdukt
(
@ID uniqueidentifier,
@Name nchar(10),
@Styck int,
@MärkeID uniqueidentifier,
@MärkeNamn nchar(10),
@Varunummer nchar(10)
)
AS
BEGIN TRANSACTION
-- Steg 2 lägger till person och familj till den personen i samma transaktion
INSERT INTO Produkt (ID, Namn, Antal, MärkeID) values (@ID, @Name, @Styck, @MärkeID);
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END
INSERT INTO Märke (ID, Märke, Varunummer) values (@MärkeID, @MärkeNamn, @Varunummer);
IF @@ERROR <> 0
BEGIN
ROLLBACK
RETURN
END
COMMIT
Inga problem alls med denna procedur.
Efter detta skapade jag en aspx sida
Jag ville kunna göra samma sak genom att jag fyller i värden i ett par textboxar på en sida och matar in dessa i databasen.
När jag klickade på knappen Lägg till så skulle datan matas in
Koden:
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
SqlCommand myCommand = new SqlCommand("AddMärkeAndProdukt", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
// Skapar parametrar att passa mot lagrad procedur. Value är alltså det som finns i textboxen
myCommand.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = System.Guid.NewGuid();
myCommand.Parameters.Add("@Name", SqlDbType.NChar).Value = tbProdukt.Text;
myCommand.Parameters.Add("@Styck", SqlDbType.Int).Value = tbAntal.Text;
myCommand.Parameters.Add("@MärkeID", SqlDbType.UniqueIdentifier).Value = System.Guid.NewGuid();
myCommand.Parameters.Add("@MärkeNamn", SqlDbType.NChar).Value = tbMärke.Text;
myCommand.Parameters.Add("@Varunummer", SqlDbType.NChar).Value = tbVarunummer.Text;
Även här var det inga problem. Och det gick att mata in via webbsidan.
Jag vill kunna göra samma sak fast att den ska minska på antalet produkter.
Exempel:
Vi antar att jag har 4 paket pasta från Barilla i databasen. Om jag via websidan beställer 2 paket pasta från Barilla så ska det visa i databasen att det är 2 paket kvar av pastan.
Jag ska skapade en Lagrad procedur "RemoveProdukt" till detta:
(
@Name nchar(10),
@Styck int
)
AS
BEGIN TRANSACTION
SELECT Antal FROM Produkt MINUS SELECT @Styck FROM Produkt WHERE Namn = @Name;
Även denna fungerar bra när jag exikverar den och antalet blir korrekt. Men hur får jag den att fungera med textboxar.
När jag la till varor så använde jag mig av Parameters.Add för att kopplade det till textboxarna, men vad kan jag använda mig av när jag ska ta bort varor.
Ursäkta om texten blev för lång