Announcement

Collapse
No announcement yet.

Frage zu einer gespeicherten Prozedur mit Parameter @@IDENTITY

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

  • Frage zu einer gespeicherten Prozedur mit Parameter @@IDENTITY

    Hallo,

    Ich habe den Parameter @@IDENTITY schon einmal in einem anderen Thread erwähnt, aber der Thread ging eigentlich um ein anderes Problem.
    http://entwickler-forum.de/showthread.php?t=54463

    Ich hätte eine Frage an euch.

    Ich entwickle eine Datenbank Client Applikation, die auf drei Projekten aufbaut:
    1.) DataAccessControl (Eine Klasse für die Verbindung)
    2.) BusinessLogic (Hier sind alle Datenbank Tabellen in Form von Klassen)
    3.) Frontend

    Ich habe im SQL-Server 2005 eine Stored Procedure geschrieben, um einen neuen Datensatz anzulegen und dass diese Prozedur mir die neue ID des Datensatzes anzeigt.

    Ich habe diese im SQL-Server Managemant Studio getestet und diese funktioniert, es wird mir die ID angezeigt nach dem ich sie ausgeführt habe.

    Hier ist der Code der SP:
    Code:
    CREATE PROC spBuchNEW
    	@VerlagID int,
    	@Titel nvarchar(100),
    	@Erscheinungsjahr int,
    	@ISBN nvarchar(50),
    	@ISBN10 nvarchar(50),
    	@ISBN13 nvarchar(50),
    	@Preis money,
    	@Buchgenre nvarchar(50)
    AS
        INSERT INTO tblBuchTiteln
        (VerlagID, Titel, Erscheinungsjahr, ISBN, ISBN10, ISBN13, Preis, Buchgenre)
        VALUES
        (@VerlagID, @Titel, @Erscheinungsjahr, @ISBN, @ISBN10, @ISBN13, @Preis, @Buchgenre)
         SELECT @@IDENTITY AS [@@IDENTITY];

    Jetzt weiss ich aber nicht wie ich diese in meinem Programm implementieren soll, damit ich im Programm auch nach Ausführung der Prozedur gleich die neue ID angezeigt bekomme.

    Jetzt habe ich diese so in einer Klasse der BL implementiert:

    Code:
    public void SaveTitelNEW()
    {
        DAL.ExecuteSP("spBuchNEW",
            DAL.DBparams("VerlagID", this.VerlagID),
            DAL.DBparams("@Titel", this.Titel),
            DAL.DBparams("@Erscheinungsjahr", this.Erscheinungsjahr),
            DAL.DBparams("@ISBN", this.ISBN),
            DAL.DBparams("@ISBN10", this.ISBN10),
            DAL.DBparams("@ISBN13", this.ISBN13),
            DAL.DBparams("@Preis", this.Preis),
            DAL.DBparams("@Buchgenre", this.Buchgenre));
    }
    Muss ich hier auch noch den Parameter @@IDENTITY implementieren?

    Wenn ich diese Methode ausführe, dann hätte ich gerne, dass in einem Datengebundenen Label die ID angezeigt wird.


    Könntet Ihr mir bitte weiterhelfen?
    Ich bin über jeden Tip und Ratschlag sehr dankbar!
    DANKE!

    LG

  • #2
    Den Identity Wert müßtest du als OUTPUT Parameter der Stored Proc mit zurückgeben. Wobei @@IDENTITY, je nach Anwendungsfall, problematisch ist.
    Wenn das in einer Multiuser Umgebung ist solltest du wohl eher SCOPE_IDENTITY() benutzen.

    Code:
    CREATE PROC spBuchNEW
    	@VerlagID int,
    	@Titel nvarchar(100),
    	@Erscheinungsjahr int,
    	@ISBN nvarchar(50),
    	@ISBN10 nvarchar(50),
    	@ISBN13 nvarchar(50),
    	@Preis money,
    	@Buchgenre nvarchar(50),
            @identity int OUTPUT
    AS
        INSERT INTO tblBuchTiteln
        (VerlagID, Titel, Erscheinungsjahr, ISBN, ISBN10, ISBN13, Preis, Buchgenre)
        VALUES
        (@VerlagID, @Titel, @Erscheinungsjahr, @ISBN, @ISBN10, @ISBN13, @Preis, @Buchgenre)
         SET @identity = @@IDENTITY;

    Der MSDN Artikel Ändern von Daten mit gespeicherten Prozeduren (ADO.NET) ist da bestimmt für dich auch hilfreich.

    Comment


    • #3
      Falls du Replikation einsetzt, schau dir diesen Artikel an bevor du Datenmüll produzierst!

      Comment


      • #4
        @Ralf Jansen

        DAnke für deine Hilfe!

        Wie würdest du, die von dir aufgeschriebene Gespeicherte Prozedur in diese von mir entworfene Methode implementieren?
        Code:
        public void SaveTitelNEW()
        {
            DAL.ExecuteSP("spBuchNEW",
                DAL.DBparams("VerlagID", this.VerlagID),
                DAL.DBparams("@Titel", this.Titel),
                DAL.DBparams("@Erscheinungsjahr", this.Erscheinungsjahr),
                DAL.DBparams("@ISBN", this.ISBN),
                DAL.DBparams("@ISBN10", this.ISBN10),
                DAL.DBparams("@ISBN13", this.ISBN13),
                DAL.DBparams("@Preis", this.Preis),
                DAL.DBparams("@Buchgenre", this.Buchgenre));
        }
        SqlConnection, SqlAdapter, usw. sind alle in der Klasse "DAL", die für die Verbindung zuständig ist!
        Hier ist "DBparams" eine Instanz von der Klasse SqlParameter

        In der Methode müsste ich nur noch den Output Parameter hinzufügen.

        DANKE!!!

        MFG

        Comment


        • #5
          Hm, DBParams klingt nach Mehrzahl, aber nicht nach einem einzelnen Parameter. Ich weiß deshalb nicht genau, wie es bei dir einzubinden ist; aber etwa so geht es:
          Code:
              SqlParameter output = new SqlParameter("@NewId");   //  ohne Angabe des Wertes
              output.DbType = DbType.Int32;                          //  stattdessen der Typ
              output.Direction = ParameterDirection.Output;   //  das ist wichtig!
              DAL.ExecuteSP("spBuchNEW",
                  DAL.DBparams("VerlagID", VerlagID),
                  DAL.DBparams("@Titel", Titel),
                  DAL.DBparams("@Erscheinungsjahr", Erscheinungsjahr),
                  DAL.DBparams("@ISBN", ISBN),
                  DAL.DBparams("@ISBN10", ISBN10),
                  DAL.DBparams("@ISBN13", ISBN13),
                  DAL.DBparams("@Preis", Preis),
                  DAL.DBparams("@Buchgenre", Buchgenre),
                  output
              );
          (Das überflüssige "this" geht mir auf die Nerven.)

          Gruß Jürgen

          Comment


          • #6
            Danke für deine ausführliche Hilfestellung!

            Werde ich gleich testen!

            MFG

            Comment

            Working...
            X