Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C++CLI / VB .Net / .Net-Framework » Konzept Frage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
18.01.2007, 20:38 Uhr
Eroli



Hallo,

also, ich habe sagen wir mal einen Shop.
Wenn ein User jetzt etwas neues einstellen möchte, so geht das in 2 Schritten:

1) Objekt mit allen Daten
2) Bilder zu dem Objekt

Um die Bilder korrekt zu speichern, brauche ich die ID des zuvor angelegten Objektes und dabei DARF ES SICH KEINESWEGS um ein anderes Objekt handeln. Auch, wenn z.B. 2 Objekte fast zeitgleich eingestellt werden.

Ich muss die ID, die beim Anlegen erstellt wird(Id ist eine Identitätsspalte die sich automatisch um 1 vergrößert) nachdem erstellen irgendwie direkt auslesen und am besten irgendwo speichern.
Eigentlich wollte ich sie nicht in einer Variable speichern, da dass diese ja leer ist, nachdem die Seite neugeladen wurde(ASP.NET) und wenn man nun auf einen BUtton drückt, wird die Seite ja neugeladen oder nicht?

Hoffe ihr habt das verstanden und habt ein paar Vorschläge.


Viele Grüße,
Eroli
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.01.2007, 22:09 Uhr
Eroli



Hallo nochmal.

Wieso gibt es für das Editieren ein Zeitlimit?!?!

Also, ich dachte mir das eventuell so: Nachdem Schritt 1 abgeschlossen ist, wird die ID abgerufen indem bei der WHERE Bedingung ALLE vorherigen Daten angegeben werden. Damit geht man ziemlich sicher, eigentlich sogar ganz sicher, weil eine Row mit dem DateTime.Now() Wert gefüllt ist, und ich kriege die Id.
Dann lass ich die Seite "reladen", absichtlich und gebe dabei die ID als Query String an.
Ins PageLoad Ergeigniss kommt dann, dass wenn ne Id angegeben is und blabla alles so angezeigt wird, wie der User es brauhct, sprich: Schritt 2 erscheint ihm!
Da die ID im Query String ist, hat man sie im Schritt 2 auch direkt parat und es kann wietergehen.


Fällt euch was besseres ein?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.01.2007, 19:09 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
"SELECT Current_Id FROM tabelle" liefert den letzten Identity-Wert der angegebenen Tabelle.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2007, 11:52 Uhr
Eroli



Diese Abfrage müsste aber so schnell wie nur möglich gestartet werden, falls ein anderer User bereits in sekundenbruchteilen danach ein neues Objekt reinstellt, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2007, 12:44 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Vorab:
Weiß jetzt nicht genau ob current_Id vom .net SQLClient unterstützt wird (an der Konsole funzt das), was aber funktionieren muss ist SCOPE_IDENTITY().

Was ist denn daran ein Problem:
1) "Objekt mit allen Daten" wird angelegt. Direkt nach dem Anlegen holst du den zuletzt generierten PK und übergibst den Key an
2) "Bilder zu dem Objekt"

Prinzipell gibt es drei Möglichkeiten die letzte Identity auszulesen, doch Vorsicht:
SELECT @@Identity: gibt den letzten Identity-Wert eines Gültigkeitsbereichs zurück
Ein Insert in eine Tabelle wird gemacht: SELECT @@Identity liefert den Identity-Wert 2
Nun wird z.B. ein Trigger ausgelöst, der in einer anderen Tabelle einen Datensatz anlegt. Dort ist aber der nächste Identity-Wert 9. Also wird 9 zurück gegeben.
SELECT Current_Id FROM myTable: User 1 speichert seinen Daten. Der Identity-Wert 2 wird vergeben. User 2 speichert seine Daten zur gleichen Zeit. Identity-Wert 3 wird vergeben. Current_Id gibt für beide 3 zurück.
SELECT Scope_Identity: Liefert den letzten Identity-Wert des aktuellen Gültigkeitsbereichs.
User 1 speichert seinen Daten. Der Identity-Wert 2 wird vergeben. User 2 speichert seine Daten zur gleichen Zeit. Identity-Wert 3 wird vergeben. Scope_Identity gibt für User_1 2 zurück User_2 erhält 3.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 20.01.2007 um 12:45 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2007, 14:03 Uhr
Eroli




Zitat von Uwe:
Hallo,
Vorab:
Weiß jetzt nicht genau ob current_Id vom .net SQLClient unterstützt wird (an der Konsole funzt das), was aber funktionieren muss ist SCOPE_IDENTITY().

Was ist denn daran ein Problem:
1) "Objekt mit allen Daten" wird angelegt. Direkt nach dem Anlegen holst du den zuletzt generierten PK und übergibst den Key an
2) "Bilder zu dem Objekt"

Prinzipell gibt es drei Möglichkeiten die letzte Identity auszulesen, doch Vorsicht:
SELECT @@Identity: gibt den letzten Identity-Wert eines Gültigkeitsbereichs zurück
Ein Insert in eine Tabelle wird gemacht: SELECT @@Identity liefert den Identity-Wert 2
Nun wird z.B. ein Trigger ausgelöst, der in einer anderen Tabelle einen Datensatz anlegt. Dort ist aber der nächste Identity-Wert 9. Also wird 9 zurück gegeben.
SELECT Current_Id FROM myTable: User 1 speichert seinen Daten. Der Identity-Wert 2 wird vergeben. User 2 speichert seine Daten zur gleichen Zeit. Identity-Wert 3 wird vergeben. Current_Id gibt für beide 3 zurück.
SELECT Scope_Identity: Liefert den letzten Identity-Wert des aktuellen Gültigkeitsbereichs.
User 1 speichert seinen Daten. Der Identity-Wert 2 wird vergeben. User 2 speichert seine Daten zur gleichen Zeit. Identity-Wert 3 wird vergeben. Scope_Identity gibt für User_1 2 zurück User_2 erhält 3.


Wenn das so klappt, wäre das super. Die 100%ige Lösung meines Problems.

Doch wie benutze ich SCOPE_IDENTITY() ???


EDIT: Mit dieser Anleitung:
http://msdn2.microsoft.com/de-de/library/ms190315.aspx

komme ich nicht wirklich zurecht. Was ist ein Trigger? Ichbenutze keine Trigger?
Wie kann ich einen Gültigkeitsbereich definieren???

In dem Beispiel wird mit SCOPE_IDENTITY 4 ausgegeben, obwohl die letzte "id" eigentlich 3 ist?! ist das richtig so? Wenn ja müsste ich das bei mir dementsprechend ändern und den Wert um 1 verkleinern, damit er stimmt...


EDIT2: Ok, habe ein Zeile im Beispielcode übersehen, wo ein INSERT Befehl drine ist. Dementsprechend wäre die ID dann4 und nicht 3 und ich muss nix verkleinern. Ich denke das sollte so klappen mit dem Befehl.
Allerdings ist mir die Syntax nicht so klar

Zitat:

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]


Was mach das in den eckigen Klammern?? Und was bedeutet AS?

Dieser Post wurde am 20.01.2007 um 14:18 Uhr von Eroli editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.01.2007, 16:12 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Eroli,
Trigger = Auslöser
Ein Trigger ist im weitesten Sinn ein auf dem DBMS gespeichertes "Programm", welches bei einem bestimmten Ereignis (BeforeInsert, AfterInsert, BeforeUpdate , AfterUpdate usw.) automatisch durch das DBMS aufgerufen wird.
Zu SCOPE_IDENTITY():

C++:
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
string strCmd = "INSERT INTO T_XYZ (NAME, VORNAME) VALUES ('Hastig', 'Hans')";
cmd.CommandText = strCmd;
if (conn.State == ConnectionState.Closed)
   conn.Open();
cmd.ExecuteNonQuery();
strCmd = "SELECT SCOPE_IDENTITY()";
cmd.CommandText = strCmd;
object NextID = cmd.ExecuteScalar();
conn.Close();


Wichtig ist hierbei eigentlich nur das NextID vom Typ object ist, da IDENTITY nicht nur numerische Werte haben kann.
Also: long NextID = (long) cmd.ExecuteScalar(); ergibt einen Fehler vom SQL-Client.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.01.2007, 16:17 Uhr
Eroli




Zitat:
Wichtig ist hierbei eigentlich nur das NextID vom Typ object ist, da IDENTITY nicht nur numerische Werte haben kann.
Also: long NextID = (long) cmd.ExecuteScalar(); ergibt einen Fehler vom SQL-Client.


Aber wenn ich meiner Identitätsspalte sage, dass sie bloß immer um 1 größer wird und vom Typ INT ist, dann kann ich doch auch problemlos einen long oder int nehmen oder???
Jetzt nur für meinen speziellen fall mein ich!


Der Name NextID ist aber auch nicht ganz passend, oder? Ist ja eigentlich nicht die NÄCHSTE Id, sondern die derzeitige vom aktuellsten objekt, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.01.2007, 16:22 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Es geht hierbei nur um den Zugriff im Programm und nicht um den Typ in der Indentitätsspalte Deiner Tabelle.
Probier es einfach mal aus, dann wirst Du sehen was ich meine.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.01.2007, 16:31 Uhr
Eroli



Ok, ich bedanke mich schonmal recht herzlich für deine supertolle Unterstützung!!!!!!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C++CLI / VB .Net / .Net-Framework ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: