Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Någon har redan uppdaterat

Postades av 2010-03-22 19:14:15 - Magnus Karlsson, i forum databaser, Tråden har 14 Kommentarer och lästs av 7053 personer

Läser in en rad i en tabell som består av kolumnerna nr och namn. Stänger sedan connection.
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 2008


Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-23 07:52:06 - Johan Djupmarker

Hur gör du förändringen? Om du använder ett DataSet/DataAdapter i .NET så finns den funktionaliteten inbyggd.

Johan


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-23 10:47:05 - Magnus Karlsson


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



Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-23 13:15:28 - Johan Djupmarker

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:

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.

Johan


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-23 14:43:17 - Magnus Karlsson


Ä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.


Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-23 16:26:17 - Johan Djupmarker

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.

Johan


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-23 16:40:14 - Magnus Karlsson


Det skulle gå dubbelt med värden som skulle skickas till SP:n...


Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-23 17:41:40 - Johan Djupmarker

Nja, inte i antal värden, men möjligtvis i datamängd beroende på längden på namnen.

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.

Johan


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-23 21:16:54 - Magnus Karlsson


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
Magnus


Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-24 07:31:31 - Johan Djupmarker

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.

Johan


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-24 14:26:02 - Magnus Karlsson

Gnäller över att det saknas COMMIT eller ROLLBACK TRAN om inte @lastmod=@senastandrad.
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>


Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-24 18:12:02 - Håkan Borneland

Testa det här:

<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>


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-25 16:11:01 - Magnus Karlsson

Den funkar.

Men varför funkar inte <code>if(@@error<>0)</code> ?


Svara

Sv: Någon har redan uppdaterat

Postades av 2010-03-26 13:25:57 - Håkan Borneland

Därför att om "IF (@lastmod = @senastandrad) BEGIN" blir false, så hoppar du till noUpdate.
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.


Svara

Sv:Någon har redan uppdaterat

Postades av 2010-03-26 15:51:18 - Magnus Karlsson

Aha. Tackar!


Svara

Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 762
27 959
271 761
433
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies