Läser in en rad i en tabell som består av kolumnerna nr och namn. Stänger sedan connection. Hur gör du förändringen? Om du använder ett DataSet/DataAdapter i .NET så finns den funktionaliteten inbyggd. Om du måste använda en sp vet jag inte om det inbyggda stödet fungerar. Men du kan enkelt själv kopiera beteendet. Du måste spara orginalvärdet, sedan kör du en update enligt följande: Det är ju ett sätt, men eftersom "klienten" ändå måste hålla koll på ett värde så känns det lite smidigare att jämföra med originalvärdet, då slipper du en extra kolumn. Nja, inte i antal värden, men möjligtvis i datamängd beroende på längden på namnen. Då är det lite annorlunda (förutsättningen i frågan var dock bara en kolumn). Kan och vill du ändra i databasen så kan det vara ett alternativ med en tidsstämpel (eller löpnummer eller var som helst som ändras egentligen). Fördelen med att skicka med originalvärdet är att du ser vilken kolumn som ändrats om det är något värde i det. Gnäller över att det saknas COMMIT eller ROLLBACK TRAN om inte @lastmod=@senastandrad. Testa det här: Därför att om "IF (@lastmod = @senastandrad) BEGIN" blir false, så hoppar du till noUpdate.Någon har redan uppdaterat
När jag sedan vill uppdatera raden med nytt namn och någon redan har gjort en ändring sedan inläsningen. Hur tar man lättast reda på en ändring?
Labbar med MS SQL 2008Sv: Någon har redan uppdaterat
JohanSv:Någon har redan uppdaterat
Har en tabell med kolumnerna nr och namn
1. För "nr"=2 läser jag in "namn"=Magnus i en textbox. Stänger connection till databasen
2. Samtidigt utan vetskap ändrar en annan användare "namn" till Olle för nr=2
3. När jag ändrat "namn" till Kalle och vill ändra har ju annan användare ändra förutsättningarna.
Tänkt använda ado.net, sp och MS SQL.
Vad är det för något inbyggt jag kan tittat på?
MVH
Magnus
Sv: Någon har redan uppdaterat
UPDATE tabell SET namn="nytt värde" WHERE nr = 2 AND namn = "gammalt värde"
Om en post har blivit uppdaterad så är allt frid och fröjd, men om ingen post ändrades av detta kommandot så betyder det att någon annan har varit där och pillat emellan.
JohanSv:Någon har redan uppdaterat
Är det en god ide att använda sig av en kollumn "senast uppdaterad"?
I SP:n först ta reda på "senast uppdaterad". Är det samma värde som vid första laddningen så utför.Sv: Någon har redan uppdaterat
JohanSv:Någon har redan uppdaterat
Det skulle gå dubbelt med värden som skulle skickas till SP:n... Sv: Någon har redan uppdaterat
Om du håller koll på ursprungsvärde måste du skicka nummer, nytt namn och gammalt namn till SP:n. Om du kör med metoden senast ändrad måste du skicka nummer, nytt namn och ändringsdatumet som var vid läsning.
JohanSv:Någon har redan uppdaterat
Om jag ökar på kolumnerna med adress, postnummer, ort, telefon, epost mm mm.
Skulle du välja dubbla värden per kolumn till SP:n eller en senast uppdaterad.
(För historikensskull kanske man skulle behöva en senast uppdaterad samt en skapad datum.
MVH
MagnusSv: Någon har redan uppdaterat
JohanSv:Någon har redan uppdaterat
Vad kan vara galet?
"Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 7, current count = 8."
<code>
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Magnus
-- Create date:
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[sp_sparakund]
-- Add the parameters for the stored procedure here
@nr int,
@namn nvarchar(50),
@senastandrad timestamp
AS
Declare @lastmod timestamp
Declare @errMess varchar(100)
BEGIN TRAN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Läser ut aktuell senastandrad
SELECT @lastmod = senastandrad from kunder where nr=@nr
-- Om ingen ändring har skett så uppdatera posten
if (@lastmod=@senastandrad) BEGIN
UPDATE kunder set
namn=@namn
WHERE nr = @nr
if (@@error<>0) BEGIN
SET @errMess = 'Error'
GOTO noupdate
END
ELSE BEGIN
Commit TRAN
SELECT nr, namn, senastandrad
FROM kunder
WHERE nr = @nr
END
END
ELSE BEGIN
SET @errMess = 'Someone have update before you'
GOTO noupdate
END
noUpdate:
if(@@error<>0) BEGIN
ROLLBACK TRAN
RAISERROR(@errMess, 16, 1)
Return
END
</code>Sv: Någon har redan uppdaterat
<code>
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Magnus
-- Create date:
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[sp_sparakund]
@nr int,
@namn nvarchar(50),
@senastandrad timestamp
AS
DECLARE @lastmod timestamp;
DECLARE @errMess varchar(100);
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRAN;
-- Läser ut aktuell senastandrad
SET @lastmod = (SELECT senastandrad FROM kunder WHERE nr = @nr);
-- Om ingen ändring har skett så uppdatera posten
IF (@lastmod = @senastandrad) BEGIN
UPDATE kunder SET namn = @namn
WHERE nr = @nr;
SELECT nr, namn, senastandrad
FROM kunder
WHERE nr = @nr;
COMMIT TRAN;
END
ELSE BEGIN
SET @errMess = 'Someone have updated before you';
RAISERROR(@errMess, 10, 1);
ROLLBACK TRAN;
END
END TRY
BEGIN CATCH
SET @errMess = 'Error';
RAISERROR(@errMess, 16, 1);
ROLLBACK TRAN;
END CATCH
RETURN;
</code>Sv: Någon har redan uppdaterat
Den kör bara ROLLBACK TRAN om @@ERROR <> 0.
Nu har ju inget error inträffat, bara en IF sats som blev false.
Detta gör att BEGIN TRAN i början inte får en avslutande COMMIT/ROLLBACK TRAN.
Därav felmeddelandet.