Announcement

Collapse
No announcement yet.

nach insert gleich id return

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

  • nach insert gleich id return

    Guten tag ihr (und Mahlzeit) ^^

    also .. mein kleines problemchen is wieder mal, das ich eine stored Procedure habe und in dieser wird zuerst ein INSERT auf eine tabelle gemacht. dann hole ich aus dieser Tabelle mit SCOPE_IDENTITY die ID raus um diese dann mit einem zweiten INSERT in die andere Tabelle zu speichern..
    so .. und jetzt will ich das ich diese ID die ich da mit dem Scope geholt habe, ans programm (in c#) zurückgebe, aber er sagt mir jedes mal, das der Reader leer is -.-

    könnte mir da eventuell jemand helfen?

    LG Sabrina

  • #2
    Zeig mal etwas Code

    Comment


    • #3
      Das is die stored procedure...

      Code:
      DECLARE @lid int
      
      INSERT INTO Lektuere (Titel, Verlag_ID, Kategorie_ID, Art_ID)
      VALUES (@titel, @verlag, @kate, 2)
      
      SET @lid = SCOPE_IDENTITY()
      
      INSERT INTO Manga (ISBN, Lektuere_ID, Seite, Jahr)
      VALUES (@isbn, @lid, @seite, @jahr)
      
      RETURN SELECT @@Identity As LektID FROM Lektuere

      und im Programm ruf ich das halt dann so auf

      Code:
              SqlCommand cmd = SPCreater.createSPCommand(param, sp);
              SqlDataReader rd = null;
      
              try
              {
                  cmd.Connection.Open();
                  rd = cmd.ExecuteReader();
      
                  if (rd.HasRows)
                  {
                      while (rd.Read())
                      {                    
                          hf_LektID.Value = rd["LektID"].ToString();
                      }
                  }
      
                  save = true;
              }
              catch (Exception ex)
              {
              }
              finally
              {
                  rd.Close();
                  cmd.Connection.Close();
              }

      Comment


      • #4
        1. SCOPE_IDENTITY gibt dir die letzte verwendete Identity zurück; das muss nicht zwingend die von Deinem INSERT sein, sondern kann von einem anderen Prozess stammen (MultiUser-Zugriff!!!). Das kann man schon daran sehen, das Du bei dem Wert keine Tabelle angeben kannst...
        Ist gefährlich, funktioniert vielleicht, aber nicht zwingend immer.

        3. Welche Version des MS SQL Servers? Beim 2005 gibt es OUTPUT, mit dem Du Dir den geinserten Datensatz zurückgeben lassen kannst samt der immer richtigen ID.

        3. Warum nicht so?
        RETURN @lid
        In der Variable sollte doch schon der (vermeintlich) richtige Wert stehen

        Olaf
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          naja .. glaub nicht, das das Progi von jemanden verwendet wird (machs für mich selbst )

          mit diesem output hab ich das ja schon probiert .. aber da brauch ich dann 2ids eine für den 2ten insert auf die andere tabelle und dann dieses output, doch mag er dies nicht wirklich

          jep .. denk mal das es 2005 (is bei dem microsoft visual studio dabei)

          jup, steht schon in dieser variable, aber er schreibt mir da nix in das hiddenfield -.-

          er gibt eben nix zurück

          Comment


          • #6
            Nimm mal das RETURN weg, so das nur das SELECT bleibt, dann sollte es gehen.

            Für OUTPUT kann man nur eine TABLE-Variable verwenden.
            Hier mal ein Test zum Nachvollziehen im Management Studio: Wenn Du noch einen 2ten Wert zurückgeben willst, kannst Du ihn einfach ans SELECT anhängen.

            [highlight=SQL]USE TempDB;
            GO

            -- Objekte anlegen
            CREATE TABLE #Lektuere
            (Titel varchar(10),
            Verlag_ID int IDENTITY);
            GO

            CREATE TABLE #Manga
            (ISBN varchar(10),
            Lektuere_ID int);
            GO

            CREATE PROCEDURE spTmpTest
            AS
            DECLARE @lID int
            DECLARE @MyTableVar table(lID int)

            INSERT INTO #Lektuere (Titel)
            OUTPUT inserted.Verlag_ID INTO @MyTableVar
            VALUES ('Test')

            SELECT @lID = lID FROM @MyTableVar

            INSERT INTO #Manga (ISBN, Lektuere_ID)
            VALUES ('DE1234', @lID)

            SELECT @lID AS Lektuere_ID
            --RETURN @lID --Liefert nichts zurück!!!
            GO

            --Aufräumen
            exec spTmpTest;
            DROP PROCEDURE spTmpTest;
            DROP TABLE #Lektuere
            DROP TABLE #Manga
            GO
            [/highlight]

            Olaf
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              ok o_O
              darf ich kurz anmerken, das ich rein Garnichts versteh? xD

              hab das jetzt bei mir so umgebaut, wie ich glaube, das es was so ist wie bei deinem code
              und im gefällt die Variable "@LektID" (also in deinem Code die "@MyTableVar") nicht

              Fehlermeldung: Falsche Syntax in der Nähe von '@LektID'
              Zuletzt editiert von Mokona; 28.02.2008, 15:51.

              Comment


              • #8
                Wenn Dir Quick&Dirty reicht, brauchst Du wie erwähnt aus Deinem ursprünglichen Statement nur das RETURN entfernen.

                Und wenn ich jetzt noch genau wüsste, wie Du es umgebaut hast (..lass mal Code sehen..), könnte ich Dir vielleicht sagen, woran es hapert.

                Zur Erklärung (um die Du vorhin noch batest):
                OUTPUT gibt Dir als Ergebnis der DML Aktion die betroffenen Datensätze als Subset der Tabelle zurück; also mit allen Feldern. Hier wäre es nur ein Datensatz, das können aber auch beliebig viele sein (bei UPDATE).
                Das Ergebnis bekommst Du nicht in eine Variable vom Typ INT oder so rein, sondern wieder nur in eine Tabelle; hier eine Variable vom Typ TABLE.
                Ginge ebenso mit einer Temp-Tabelle oder einer richtigen.
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  ok .. also wenn dann die ID in eine Tabelle gespeichert wird, dann muss ich das mit einem dataset rausholen, oder ?! .. aber eigentlich müsste das ja mit dem Reader auch gehn O_O

                  Code:
                  DECLARE @lid int;
                  DECLARE @LektID TABLE(lID int);
                  
                  INSERT INTO Lektuere (Titel, Verlag_ID, Kategorie_ID, Art_ID)
                  OUTPUT inserted.ID INTO @LektID
                  VALUES (@titel, @verlag, @kate, 2)
                  
                  SELECT @lid = lID FROM @LektID
                  
                  INSERT INTO Manga (ISBN, Lektuere_ID, Seite, Jahr)
                  VALUES (@isbn, @lid, @seite, @jahr)
                  
                  SELECT @lid AS Lektuere_ID

                  also ... hab das jetzt mit dem dataset probiert und er schreibt mir das schön rein nur hab ich jetzt einen anderen fehler
                  "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
                  ich geh dem jetzt mal auf dem Grund

                  LG
                  Zuletzt editiert von Mokona; 29.02.2008, 09:44.

                  Comment


                  • #10
                    Du kannst auch den Inhalt der TABLE-Variable ausgeben lassen, was wäre vor allem dann interessant, wenn Du mehrere Spalten / Zeilen hast, weil Du z.B. mehrere Inserts machst, also einfach an Ende
                    [highlight=code]SELECT * FROM @LektID[/highlight]
                    schreiben.

                    Die Fehlermeldung kommt (zum Glück ;-) von C#, das ist irgendetwas nicht instanziiert.
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #11
                      also .. anstatt des letzten select-statement dieses hinschreiben oO

                      ja .. aber keine ahnung was ich da schon wieder nicht instanziert habe -.-
                      hab noch nie ein hiddenfield mit einem dataset-wert befüllt xD

                      Comment


                      • #12
                        *JUHUUUU*
                        es hat funktioniert xD
                        im Reader steht ein wert .. ich glaubs ja nicht xD

                        ich danke dir/euch vielmals

                        Comment

                        Working...
                        X