Announcement

Collapse
No announcement yet.

DataAdapter Update mit CommandBuilder- Rückgabewert möglich?

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

  • DataAdapter Update mit CommandBuilder- Rückgabewert möglich?

    Hallo zusammen!
    .
    Ich habe nicht unbedingt ein Problem, sondern suche einen "alternativen" Lösungsweg.
    Ich hab einen DataAdapter samt DataSet und Commandbuilder.
    Funzt alles ganz wunderbar.
    .
    Aber: Ist es möglich, das die Update() Methode des DataAdapters mir bei einem Insert den neu erzeugten Primary Key (ist eine AutoWert Spalte in der Access DB, also mein Programm generiert ihn nicht) zurückliefrt?
    .
    Soweit ich wess geht das ja mit mit DataCommands, also zum Bsp commandxyz.ExectuteScalar().
    Dann aber kann ich meinen doch recht komfortablem CommandBuilder nicht mehr benutzen.
    Das ist nicht nur unbedingt aus Faulheitsgründen ärgerlich, sondern anderes kostet a) Zeit und b) ob ICH es besser mache als der Commandbuilder is so ne Sache .
    .
    Zumindest glaube ich das es recht praktisch werden könnte, dass er äusserst extensive WHERE-Klauseln generiert, in denen die aktuellen Werte der DB nochmal gechecked werden, ob sie sich mittlerweile geändert haben?
    .
    Von soher versuche ich ihn eigentlich zu erhalten.
    Oder kann ich mir einfach parallel zum Commandbuilder selber ein INSERT Command schreiben (was ja nun wirklich einfacher is), und das dann selber per ExecuteScalar ausführen?
    Nicht das sich nachher Commandbuilder und selbstgebasteltes Command in die Quere kommen...?

  • #2
    Ich habe gerade auf eine ähnliche Frage einen Verweis auf:<p>
    http://www.entwickler-forum.de/webx?128@@.4a87251e<p>
    bekommen.<p>
    Mari
    Schöne Grüße, Mario

    Comment


    • #3
      hm so wirklich kann ich damit nix anfange, aber ich habe das hier gefunden...

      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconRetrievingIdentityOrAutonumberValues.as

      Comment


      • #4
        um das mal etwas weiter zu elaborieren:

        obiges Bsp ist für meine Bedürfnisse perfekt.
        Ich muss an meinen Adapter und meine Commands nicht ran.
        Lediglich
        :
        protected void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args)
        {
        // Include a variable and a command to retrieve the identity value from the Access database.
        int newID = 0;
        OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);
        .
        if (args.StatementType == StatementType.Insert)
        {
        // Retrieve the identity value and store it in the CategoryID column.
        newID = (int)idCMD.ExecuteScalar();
        args.Row["CategoryID"] = newID;
        }
        }
        .
        dieser zuckergleiche Code reicht, und ich habe meinen neuen generierten primary key:

        Comment


        • #5
          Ich weiß nicht genau, ob das bei Access der Fall ist, aber beim SQL Server muss man vorsichtig mit @@IDENTITY sein, wenn Trigger voran geschaltet sind. In dem Fall sollte man lieber auf SCOPE_IDENTITY() zurückgreifen

          Comment


          • #6
            hm tja es ist das "offizielle" Bsp von MS, aber das muss ja nix heissen.
            Noch habe ich keine Trigger (ob welche kommen, mal gucken).
            Aber SCOPE_IDENTITY() is eine Funktion?

            Wovon

            Comment


            • #7
              Ja. Schau mal in der Onlinehilfe nach

              SCOPE_IDENTITY
              Gibt den letzten IDENTITY-Wert zurück, der in eine IDENTITY-Spalte im selben Gültigkeitsbereich eingefügt wurde. Ein Gültigkeitsbereich ist ein Modul - eine gespeicherte Prozedur, ein Trigger, eine Funktion oder ein Batch. Daher befinden sich zwei Anweisungen im selben Gültigkeitsbereich, wenn sie sich in derselben gespeicherten Prozedur, in derselben Funktion oder im selben Batch befinden.

              Bsp aus der Online-Doku des SQL Server 2000:

              In diesem Beispiel werden zwei Tabellen, TZ und TY, sowie ein INSERT-Trigger für TZ erstellt. Wenn eine Zeile in die Tabelle TZ eingefügt wird, wird der Trigger (Ztrig) ausgelöst und fügt eine Zeile in TY ein.

              USE tempdb
              GO
              CREATE TABLE TZ (
              Z_id int IDENTITY(1,1)PRIMARY KEY,
              Z_name varchar(20) NOT NULL)

              INSERT TZ
              VALUES ('Lisa')
              INSERT TZ
              VALUES ('Mike')
              INSERT TZ
              VALUES ('Carla')

              SELECT * FROM TZ

              --Result set: This is how table TZ looks
              Z_id Z_name
              -------------
              1 Lisa
              2 Mike
              3 Carla

              CREATE TABLE TY (
              Y_id int IDENTITY(100,5)PRIMARY KEY,
              Y_name varchar(20) NULL)

              INSERT TY (Y_name)
              VALUES ('boathouse')
              INSERT TY (Y_name)
              VALUES ('rocks')
              INSERT TY (Y_name)
              VALUES ('elevator')

              SELECT * FROM TY
              --Result set: This is how TY looks:
              Y_id Y_name
              ---------------
              100 boathouse
              105 rocks
              110 elevator

              /*Create the trigger that inserts a row in table TY
              when a row is inserted in table TZ*/
              CREATE TRIGGER Ztrig
              ON TZ
              FOR INSERT AS
              BEGIN
              INSERT TY VALUES ('')
              END

              /*FIRE the trigger and find out what identity values you get
              with the @@IDENTITY and SCOPE_IDENTITY functions*/
              INSERT TZ VALUES ('Rosalie')

              SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
              GO
              SELECT @@IDENTITY AS [@@IDENTITY]
              GO

              --Here is the result set.
              SCOPE_IDENTITY
              4
              /*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/

              @@IDENTITY
              115
              /*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*

              Comment

              Working...
              X