Announcement

Collapse
No announcement yet.

DeleteCommand ,DataAdapter, Update, Stored Procedure

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DeleteCommand ,DataAdapter, Update, Stored Procedure

    Das ist meine Stored Prosedure

    CREATE PROCEDURE DeletePP
    @ProjektFK int,
    @ProduktFK int,
    @tspPP timestamp,
    @ProjektProduktPK int

    AS
    Declare @tspProjekt timestamp
    Set @tspProjekt=(select tsp from Projekt where ProjektPK=@ProjektFK )
    If @tspProjekt=@tspPP
    Begin
    Print 'kein Parallelitätskonflikt Delete'
    Delete from ProjektProdukt where ProjektProduktPK=@ProjektProduktPK

    End
    else
    Print 'es wurde nichts gelöscht'
    GO
    Tabelle ProjektProdukt(ProjektProduktPK,ProjektFK,ProduktF K,tspPP)

    Das ist der Code in Vb.NET
    dap6.DeleteCommand = New SqlCommand("DeletePP", cnn)
    dap6.DeleteCommand.CommandType = CommandType.StoredProcedure
    dap6.DeleteCommand.Parameters.Add("@ProjektProdukt PK", SqlDbType.Int, 4, "ProjektProduktPK")
    dap6.DeleteCommand.Parameters.Add("@ProjektFK", SqlDbType.Int, 4, "ProjektFK")
    dap6.DeleteCommand.Parameters.Add("@ProduktFK", SqlDbType.Int, 4, "ProduktFK")
    dap6.DeleteCommand.Parameters.Add("@tspPP", SqlDbType.Timestamp, 8, "tspPP")

    Frage: Warum im vergleich @tspProjekt=@tspPP in Stored Procedure DeletePP kommt immer falsch raus??????????
    Ich habe ähnliche Stored Procedure für Insert geschrieben(also mit dem Vergleich @tspProjekt=@tspPP und es funktioniert).

  • #2
    Jetzt funktioniert es mit löschen undd einfügen aus der Anwendung mit diesen Stored Proceduren, aber es kommt kein DBConcurrencyException sondern die Zeilen werden trotz dem Vergleich einfach eingefügt.
    Als dieselbe Situation in Query Analyser konstruieren wird der Datensatz nicht eingefügt, aber von der Anwendung aus schon.

    Das ist der Code aus Query Analyser
    Declare @tspPP timestamp
    Set @tspPP=(select tsp from Projekt where ProjektPK=191)
    Update Projekt set CrystKapKgS=2 where ProjektPK=191
    Declare @tspProjekt timestamp
    Set @tspProjekt=(select tsp from Projekt where ProjektPK=191)
    If @tspProjekt=@tspPP
    Begin
    Print 'kein Parallelitätskonflikt'
    Insert into ProjektProdukt (ProjektFK, ProduktFK) Values (191, 2)
    select * from ProjektProdukt where ProjektProduktPK=@@identity
    End
    Was mache ich falsch

    Comment


    • #3
      Jetzt funktioniert es mit löschen undd einfügen aus der Anwendung mit diesen Stored Proceduren, aber es kommt kein DBConcurrencyException sondern die Zeilen werden trotz dem Vergleich einfach eingefügt.
      Als dieselbe Situation in Query Analyser konstruieren wird der Datensatz nicht eingefügt, aber von der Anwendung aus schon.
      Declare @tspPP timestamp
      Set @tspPP=(select tsp from Projekt where ProjektPK=191)
      Update Projekt set CrystKapKgS=2 where ProjektPK=191
      Declare @tspProjekt timestamp
      Set @tspProjekt=(select tsp from Projekt where ProjektPK=191)
      If @tspProjekt=@tspPP
      Begin
      Print 'kein Parallelitätskonflikt'
      Insert into ProjektProdukt (ProjektFK, ProduktFK) Values (191, 2)
      select * from ProjektProdukt where ProjektProduktPK=@@identity
      End
      Was mache ich falsch

      Comment


      • #4
        Jetzt funktioniert es mit löschen undd einfügen aus der Anwendung mit diesen Stored Proceduren, aber es kommt kein DBConcurrencyException sondern die Zeilen werden trotz dem Vergleich einfach eingefügt.
        Als dieselbe Situation in Query Analyser konstruieren wird der Datensatz nicht eingefügt, aber von der Anwendung aus schon.

        Declare @tspPP timestamp
        Set @tspPP=(select tsp from Projekt where ProjektPK=191)
        Update Projekt set CrystKapKgS=2 where ProjektPK=191
        Declare @tspProjekt timestamp
        Set @tspProjekt=(select tsp from Projekt where ProjektPK=191)
        If @tspProjekt=@tspPP
        Begin
        Print 'kein Parallelitätskonflikt'
        Insert into ProjektProdukt (ProjektFK, ProduktFK) Values (191, 2)
        select * from ProjektProdukt where ProjektProduktPK=@@identity
        End
        Was mache ich falsch

        Comment


        • #5
          Jetzt funktioniert es mit löschen undd einfügen aus der Anwendung mit diesen Stored Proceduren, aber es kommt kein DBConcurrencyException sondern die Zeilen werden trotz dem Vergleich einfach eingefügt.
          Als dieselbe Situation in Query Analyser konstruieren wird der Datensatz nicht eingefügt, aber von der Anwendung aus schon.
          Declare @tspPP timestamp
          Set @tspPP=(select tsp from Projekt where ProjektPK=191)
          Update Projekt set CrystKapKgS=2 where ProjektPK=191
          Declare @tspProjekt timestamp
          Set @tspProjekt=(select tsp from Projekt where ProjektPK=191)
          If @tspProjekt=@tspPP
          Begin
          Print 'kein Parallelitätskonflikt'
          Insert into ProjektProdukt (ProjektFK, ProduktFK) Values (191, 2)
          select * from ProjektProdukt where ProjektProduktPK=@@identity
          End
          Was mache ich falsch

          Comment


          • #6
            Hallo,

            wenn die Stored Procedure beim manuellen Aufruf korrekt ausgeführt wird, kann die Ursache für dieses Verhalten nur darin liegen, dass der Client den <b>falschen</b> Timestamp-Wert übergibt. In meinem Beispielprojekt auf dem <i>dot.net magazin</i>-Artikel sah die entscheidende Stelle so aus:
            <pre>
            <font color="#003399"><i>// </i></font>
            <font color="#003399"><i>// sqlUpdateCommand1</i></font>
            <font color="#003399"><i>// </i></font>
            <b>this</b>.sqlUpdateCommand1.CommandText = <font color="#9933CC">&quot;UPDATE OptimisticTimespampTbl SET Wert = @Wert WHERE &quot;</font> +
            <font color="#9933CC">&quot;(RecID = @Original_RecID) AND (ts = @Original_ts); &quot; </font>+ <font color="#9933CC">
            &quot;SELECT RecID, Wert, ts FROM OptimisticTimespampTbl WHERE &quot;</font> +
            <font color="#9933CC">&quot;(RecID = @RecID)&quot;</font>;
            <b>this</b>.sqlUpdateCommand1.Connection = <b>this</b>.sqlConTempdb;
            <b>this</b>.sqlUpdateCommand1.Parameters.Add(<b>new</b> System.Data.SqlClient.SqlParameter(
            <font color="#9933CC">&quot;@Wert&quot;</font>, System.Data.SqlDbType.VarChar, 9, <font color="#9933CC">&quot;Wert&quot;</font>));
            <b>this</b>.sqlUpdateCommand1.Parameters.Add(<b>new</b> System.Data.SqlClient.SqlParameter(
            <font color="#9933CC">&quot;@Original_RecID&quot;</font>, System.Data.SqlDbType.<b>Int</b>, 4,
            System.Data.ParameterDirection.Input, <b>false</b>, ((System.<b>Byte</b>)(0)),
            ((System.<b>Byte</b>)(0)), <font color="#9933CC">&quot;RecID&quot;</font>, <b><font color="#FF0000">System.Data.DataRowVersion.Origina l</font></b>, <b>null</b>));
            <b>this</b>.sqlUpdateCommand1.Parameters.Add(<b>new</b> System.Data.SqlClient.SqlParameter(
            <font color="#9933CC">&quot;@Original_ts&quot;</font>, System.Data.SqlDbType.VarBinary, 8,
            System.Data.ParameterDirection.Input, <b>false</b>, ((System.<b>Byte</b>)(0)),
            ((System.<b>Byte</b>)(0)), <font color="#9933CC">&quot;ts&quot;</font>, <b><font color="#FF0000">System.Data.DataRowVersion.Origina l</font></b>, <b>null</b>));
            <b>this</b>.sqlUpdateCommand1.Parameters.Add(<b>new</b> System.Data.SqlClient.SqlParameter(
            <font color="#9933CC">&quot;@RecID&quot;</font>, System.Data.SqlDbType.<b>Int</b>, 4, <font color="#9933CC">&quot;RecID&quot;</font>));
            </pre>
            Entscheidend ist, dass bei der Timestamp-Spalte der originale Wert über <b>System.Data.DataRowVersion.Original</b> an den DataAdapter übergeben wird

            Comment

            Working...
            X