webForumDet fria alternativet

skapa poster i mssqldatabas med c#

Databaser & SQL

28 svar · 1 935 visningar · startad av Sanji

Medlem sedan juli 2009355 inlägg
Frågan#1

Hej! Jag har en asp.net applikation som först ska lägga till en post i en tabell, och sedan omedelbart hämta denna information igen från databasen för att sedan lägga till ännu en post fast i en annan tabell. Den andra posten är beroende av information från den första för att resten av applikationen ska fungera som den ska. Hur kan jag göra detta? Jag måste hämta ID't från första posten för att lägga till den andra, och den andra skrivs sedan ut i en dynamisk tabell för att visas för användaren. Hur gör jag detta på enklaste sätt, så att användaren endast behöver en knapptryckning? ska jag spara artikelnummer från den första posten, och sedan när sidan laddats om använda detta nummer för att hämta den igen för att då också få ID't, och sedan spara den andra posten?

Då måste väl även artikelnumret vara unikt för att jag ska kunna hitta endast denna?

Ursäkta om det låter krångligt/dåligt beskrivet, jag vet bara inte riktigt hur jag skall gå till väga.

Medlem sedan juli 2009355 inlägg
#2

kan jag spara artikelnummret i en ViewState-variabel?

Medlem sedan okt. 2007446 inlägg
#3

Är det är på samma sida som data skall sparas och sedan visas?
I såfall borde du ju kunna lösa det med en metod som anropar en Stored Procedure som både sparar en post och returnerar data till tabellen

nåt i stil med
MyDynamicTable.datasource=MyLittleMethod(tjolahopp.text.... osv)

IeNumrable of<poster> MyLittleMethod(string title){

// Spara post+hämta

}

Medlem sedan feb. 20041 816 inlägg
#4

Om din databasmotor fattar triggers är det den bästa lösningen.

Syntaxen är typ:

create trigger AutoPopulateSecondaryTable 
	on PrimaryTable
	after insert
as
begin
	insert into SecondaryTable
	(
		refId, 
		foo, 
		bar, 
		baz
	)
	select 
		i.id, 
		i.fooValue, 
		i.barValue, 
		i.bazValue
	from 
		inserted i
	
end

Man får automatiskt en referens till den nya, precis skapade raden i tabellen genom inserted så den andra tabellen kommer automatiskt alltid att populeras när nya rader läggs in. Skitsmidigt och effektivt.

Triggers går att lägga in för updates också. :)

Medlem sedan juli 2009355 inlägg
#5

jag visste inte att det fanns triggers ^^ det verkar vara skitbra ju! jag ska testa lite så återkommer jag om jag behöver hjälp :)

Medlem sedan juli 2009355 inlägg
#6

det finns ett litet problem, och det är att från en annan sida så ska man kunna lägga till poster i enbart den första tabellen. Om jag använder en trigger så kommer väl den andra tabellen också fyllas på oavsett varifrån jag lägger till?

Dessutom när man lägger till i både den första och andra tabellen så finns det vissa värden som inte ska läggas till i den första tabellen, utan bara i den andra. Hur får jag dessa värden in i triggern?

Medlem sedan juli 2009355 inlägg
#7

Okej, så om jag ska testa att göra en stored procedure, hur skickar jag värden till denna? Jag känner mig så dum som frågar alla dessa noobfrågor men jag har googlat runt ett tag och hittar inget som är särskilt lätt att förstå...

Medlem sedan juni 200032 967 inlägg
#8
EXEC din_procedur värde1, värde2, värde3
Medlem sedan feb. 20041 816 inlägg
#9

Sanji skrev:

det finns ett litet problem, och det är att från en annan sida så ska man kunna lägga till poster i enbart den första tabellen. Om jag använder en trigger så kommer väl den andra tabellen också fyllas på oavsett varifrån jag lägger till?

I triggern skulle du kunna kolla om ett visst värde är satt eller inte och agera därefter.

if (i.fooValue is null) -- fooValue skulle kunna vara en flagga som avgör om triggern ska köras eller ej.
begin
	insert into SecondaryTable
	(
		i.id, 
		'apa', -- istället för i.fooValue eftersom det inte har något värde.
		i.barVaue
		[...]

end

Sanji skrev:

Dessutom när man lägger till i både den första och andra tabellen så finns det vissa värden som inte ska läggas till i den första tabellen, utan bara i den andra. Hur får jag dessa värden in i triggern?

Om du inte vill att värden ska läggas till i tabell #1, då ska dom väl inte vara med i insert-statementet? Vill man ha med data från andra tabeller går det att joina in dom som i en vanlig Sql-fråga. Triggers är inte så konstiga egentligen. Tänk att inserts funkar precis som vanligt på tabellen som datat läggs in i men med skillnaden att man kan göra andra saker i följd utan att det märks för den som körde själva inserten.

I en trigger kan man alltså använda den nya datan från inserted, hämta data från en annan tabell och skjuta in resultatet (av inserten och den andra tabellen) i en tredje tabell.

Hoppas att jag inte rörde ihop det mer nu. :)

Medlem sedan feb. 20013 023 inlägg
#10

Triggers känns som helt fel väg, onödigt komplext. Använd en stored procedure.

Medlem sedan feb. 20041 816 inlägg
#11

clarkbones skrev:

Triggers känns som helt fel väg, onödigt komplext. Använd en stored procedure.

Komplext? Nej, det är det inte. Eller har du lust att förklara vad du menar med "onödigt komplext"? Är systemet beroende av att data alltid finns i tabell #2 också tycker jag inte att det är komplext alls - snarare tvärtom - men om det finns undantagsfall är det kanske inte optimalt, nej. Då måste man ju dokumentera undantagen och komma ihåg när/när inte ändringarna läggs in i tabell #2. I så fall kan jag nog hålla med. :)

Medlem sedan juli 2009355 inlägg
#12

Undantagsfall finns, som jag skrev i en tidigare post så ska man kunna köra en insert på endast FÖRSTA tabellen.

Den första tabellen är ett artikelregister som man kan fylla på från en sida, och den andra tabellen ska innehålla artiklar från artikelregistret MEN där har artiklarna också bland annat ett till ID som hör till en förfrågan, då man ska kunna lista artiklar som hör till denna förfrågan. Andra värden som antal finns också i denna tabell.

Från förfrågan-skaparen ska man också kunna skapa en helt ny artikel som sparas in både i artikelregistret och i förfråganartikelregistret, för att användaren ska slippa gå fram och tillbaka ofta när denna arbetar,vilket sparar in en massa tid.

Vad jag förstår av er så verkar ni vara överens om att det är en stored procedure som gäller. Då ska jag försöka göra en sådan, jag har dock ingen erfarenhet av detta så det blir att läsa på lite...

Tack för all hjälp hittills, återkommer!

Medlem sedan juli 2009355 inlägg
#13

kan man få värdet för ID't i en stored procedure på samma sätt som i en trigger, genom att kolla inserted?

jag har skrivit ihop en stored procedure nu, men jag har gjort något fel... den klagar på "incorrect syntax near GO".

här är den:

ALTER PROCEDURE AddArticles_InqArticles
(

@companyID varchar(50),
@articlenr varchar(50),
@term varchar(50),
@description varchar(MAX),

@inquiryartID varchar(50),
@inquiryID varchar(50),
@notice int,
@revnr varchar(30),
@pieces varchar(13),
@suborder varchar(13),
@articletext varchar(MAX)
)
AS
insert into article(ID,companyID,articlenr,term,description)Values(NULL,@companyID,@articlenr,@term,@description)

declare @ID varchar(50)
set @ID='0';
set @ID=SCOPE_IDENTITY()

insert into inquiryarticles(inquiryartID,articleID,inquiryID,revnr,pieces,suborder,notice,articletext)VALUES(NULL,@ID,@inquiryID,@revnr,@pieces,@suborder,@notice,@articletext)
GO

jag läste lite snabbt om SCOPE_IDENTYTY(), men jag vet inte riktigt hur den fungerar... men jag ska tydligen kunna hitta ID't med den

Medlem sedan jan. 20023 327 inlägg
#14

Sanji skrev:

kan man få värdet för ID't i en stored procedure på samma sätt som i en trigger, genom att kolla inserted?

Nej, den går bara att använda i en trigger.

Sanji skrev:

jag läste lite snabbt om SCOPE_IDENTYTY(), men jag vet inte riktigt hur den fungerar... men jag ska tydligen kunna hitta ID't med den

Japp! Mer om IDENTITY och SCOPE_IDENTITY här.

Sanji skrev:

jag har skrivit ihop en stored procedure nu, men jag har gjort något fel... den klagar på "incorrect syntax near GO".

Du har missat en BEGIN och END. Har korrigerat din SP nedan:

ALTER PROCEDURE AddArticles_InqArticles
(
	@companyID varchar(50),
	@articlenr varchar(50),
	@term varchar(50),
	@description varchar(MAX),

	@inquiryartID varchar(50),
	@inquiryID varchar(50),
	@notice int,
	@revnr varchar(30),
	@pieces varchar(13),
	@suborder varchar(13),
	@articletext varchar(MAX)
)
AS
BEGIN
	insert into article(ID,companyID,articlenr,term,description)Values(NULL,@companyID,@articlenr,@term,@description)

	declare @ID varchar(50)
	set @ID='0';
	set @ID=SCOPE_IDENTITY()

	insert into inquiryarticles(inquiryartID,articleID,inquiryID,revnr,pieces,suborder,notice,articletext)VALUES(NULL,@ID,@inquiryID,@revnr,@pieces,@suborder,@notice,@articletext)
END
GO
Medlem sedan juli 2009355 inlägg
#15

den säger fortfarande "incorrect syntax near 'go' "... jag kan inte se vad felet är :( men tack för att du sade till att jag hade glömt BEGIN/END!

Och tack för länken :)

Medlem sedan jan. 20023 327 inlägg
#16

Märkligt. Scriptet fungerar för mig. Vad använder du för verktyg?

Du kan även ta bort semikolonet nedan:

set @ID='0'[B];[/B]

För du felet när du kör scriptet som redigerar din SP eller när du kör din SP?

Medlem sedan juni 200032 967 inlägg
#17

Varför sätter du id som varchar? Om det är en räknare så borde det ju vara ett tal.

Och eftersom det här inte har något som helst med .NET att göra så flyttar jag tråden till lämpligare forum.

mvh

Medlem sedan jan. 20023 327 inlägg
#18

Det funderade jag också på. Om du har id-kolumner som endast är numeriska med auto-inkrementering, så ska dina ID-kolumner var av en numerisk typ, exempelvis int.

ALTER PROCEDURE AddArticles_InqArticles
(
	@companyID varchar(50),
	@articlenr varchar(50),
	@term varchar(50),
	@description varchar(MAX),

	@inquiryartID varchar(50),
	@inquiryID varchar(50),
	@notice int,
	@revnr varchar(30),
	@pieces varchar(13),
	@suborder varchar(13),
	@articletext varchar(MAX)
)
AS
BEGIN
	insert into article(ID,companyID,articlenr,term,description)Values(NULL,@companyID,@articlenr,@term,@description)

	[B]declare @ID int
	set @ID = SCOPE_IDENTITY()[/B]

	insert into inquiryarticles(inquiryartID,articleID,inquiryID,revnr,pieces,suborder,notice,articletext)VALUES(NULL,@ID,@inquiryID,@revnr,@pieces,@suborder,@notice,@articletext)
END
GO

Hur är det med variablerna: @companyID, @articlenr, @inquiryartID, @inquiryID? Känns som att de också bara är tal.

Medlem sedan juli 2009355 inlägg
#19

id't är inte ett tal eftersom id't är en uniqueidentifier. Ett exempel på ett ID är: "cf7243c8-3ef2-4d17-adf4-8769ed775973". Ursäkta mig om jag skrivit i fel forum, men när jag har löst problemet med stored procedure så tänkte jag börja skriva om själva användandet av denna på sidan, vilket då blir .net... Men jag kanske ska göra in ny tråd i så fall?

Felet får jag när jag försöker spara den, tar jag bort "GO" så försvinner felet... SP'n har jag skrivit i vs2010

Medlem sedan jan. 20023 327 inlägg
#20

Sanji skrev:

id't är inte ett tal eftersom id't är en uniqueidentifier. Ursäkta mig om jag skrivit i fel forum, men när jag har löst problemet med stored procedure så tänkte jag börja skriva om själva användandet av denna på sidan, vilket då blir .net... Men jag kanske ska göra in ny tråd i så fall?

Ja, det låter vettigt. Nu gäller ju frågorna bara SQL-server och då passar tråden in bättre här.

Sanji skrev:

Felet får jag när jag försöker spara den, tar jag bort "GO" så försvinner felet... SP'n har jag skrivit i vs2010

Ta bort GO då :) Jag rekommenderar att du använder SQL Server Management Studio Express, när du skapa dina lagrade procedurer. Finns att hämta gratis!

Om ditt id är en uniqueidentifier, varför använder du då datatypen varchar och inte uniqueidentifier?

273 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)