Laden...

ID von grade erstellen Row's bekommen

Erstellt von Ayke vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.778 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren
ID von grade erstellen Row's bekommen

verwendetes Datenbanksystem: SQL Express 08

Hi

Ich möchte eine Row mit einer Tabelle verknüpfen.
Dazu benötige ich die ID des grade erstellten Row's.

Hat jemand eine ahnung wie ich diese nach dem erstellen bekommen kann ?

82 Beiträge seit 2007
vor 16 Jahren

Hi Ayke,

wie erstellst du denn die Rows? Abhängig davon kann man einen leichten, oder komplexeren Weg finden.

Gruß
Dizzy

:::

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Über ein normales SQL Statement.

"INSERT INTO [BLABLA] (Varb1, Varb2) Values(@Varb1, @Varb2)"

3.511 Beiträge seit 2005
vor 16 Jahren

Erweitere das INSERT Statement wie folgt:


INSERT INTO [BLABLA] (Varb1, Varb2) 
OUTPUT INSERTED.[ID]
VALUES (@Varb1, @Varb2)

Wenn du den Datensatz jetzt mit ExecuteScalar einfügst, hast du im Result die ID stehen. Wobei [ID] der Spaltenname der ID-Spalte ist 😉
Du kannst mit dem OUTPUT Statement jeden Wert wieder abrufen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 16 Jahren

Danke Khalid 🙂

C
327 Beiträge seit 2008
vor 16 Jahren

Muss ich diese Reihenfolge beibehalten, oder kann ich das OUTPUT Statement auch ans Ende setzen, also so:


INSERT INTO [BLABLA] (Varb1, Varb2) 
VALUES (@Varb1, @Varb2)
OUTPUT INSERTED.[ID]

Im Prinzip ne dumme Frage, die man mit 'Propier es doch einfach aus' beantworten könnte, aber genau das ist das Problem: Ich habe KEINE MS SQL Datenbank ...

3.511 Beiträge seit 2005
vor 16 Jahren

Nein, du Reihenfolge muss


INSERT...
OUTPUT...
VALUES...

sein. Ansonsten bekommst du einen Fehler.

Ich habe KEINE MS SQL Datenbank

Blöde Frage: Warum installierst du dir nicht einfach einen?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

C
327 Beiträge seit 2008
vor 16 Jahren

So, ich noch mal. :evil:

Ich habe immer noch keinen MS SQL-Server installiert, bzw. ihn inzwischen schon zum zweiten mal deinstalliert (und ein drittes mal kommt mir dieses Sch ... Programm auch nicht mehr auf die Platte ...)
Aber ich möchte jetzt auch keine Diskussion über Vor- und Nachteile des MS SQL Server lostreten.

Ausserdem denke ich, dass diese Frage hier eher die ADO.NET Schnittstelle im Allgemeinen betrifft.

Ich habe folgenden Code:


// Database Connection
String connectionString = " ... "; // ToDo: Insert Connection String
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd;
con.Open();

int returnID;

sql = "INSERT INTO Vereine (id, Name) OUTPUT INSERTED.id VALUES ('', 'SC Paderborn 07')";

cmd = new SqlCommand(sql,con);
returnID = (int)cmd.ExecuteScalar(); 

con.Close();

Mit der Datenbank Verbindung bin ich mir zu 99,9 % sicher, dass das so richtig ist, zumindest wird das im openbook von Gallileopress so beschrieben.

Aber die Verbindung des Inserts mit der Abfrage der Last Insert ID wollte ich gerne noch mal absichern.

Deshalb meine Frage:

Funktioniert das so, also werden die Daten so übertragen und landet in returnID der letzte erzeugte AutoIndex ?

Wäre echt nett, wenn mir mal jemand kurz ein Feedback geben würde, denn langsam bin ich mit meinem Latein und meinen Quellen am Ende ...

3.511 Beiträge seit 2005
vor 16 Jahren

Kommt darauf an, wie die Datenbank designt ist. Wenn die "Id" Spalte ein IDENTITY Wert ist, dann knallt das Statement. Wenn nicht, knallt es spätestens beim 2. mal ausführen, denn


sql = "INSERT INTO Vereine (id, Name) OUTPUT INSERTED.id VALUES ('', 'SC Paderborn 07')";

der Spalte "id" wird im Insert einen Wert zugewiesen. Bei einem vernünftigen Datenbankdesign, weist man der ID-Spalte niemals einen Wert zu (gibt vielleicht seltene Ausnahmen, aber das ist hier egal).
Sonst sieht es ganz gut aus. Wobei man den Code besser aufbauen könnte. Also ein using um die SqlConnection herum.

Aber mal ganz ehrlich: Wir können hier nicht alle deine SQL Statements prüfen. Bitte installiere dir einen eigenen Server oder greif auf einen vorhandenen zu. Wenn du Probleme bei der Installation hast, oder sonstige Probleme, dann nenn sie uns

und ein drittes mal kommt mir dieses Sch ... Programm auch nicht mehr auf die Platte ...

Zeigt mir, das du da irgendwas falsch machst...

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

C
327 Beiträge seit 2008
vor 16 Jahren

Hi Khalid,

danke für deine schnelle Antwort 👍

Kurz ein paar Erklärungen:
Bisher habe ich Datenbanken nur in MySQL entwickelt (Abfragen mit PHP, bzw. Querys über phpMyAdmin).

Bei meinem INSERT Statement gehe ich davon aus, dass 'id' ein Primärer Schlüssel mit Auto Increment ist.

Wenn also der letzte id Wert in der Tabelle 5 beträgt, dann würde durch die Übergabe eines leeren Wertes quasi von der Datenbank selbstständig der Wert 6 vergeben werden.

Mit genau diesem Muster habe ich jahrelang Erfolg gehabt und so neue Datensätze (aus HTML-Formularen generiert) in die Datenbank geschrieben.

OK, vielleicht ist es etwas naiv von mir die Existenz dieser Funktionalität auch bei MS SQL Server voraus zu setzen, anderer seits wiederum, hört man immer wieder das MS SQL viel mächtiger als MySQL ist, weshalb ich so eine simple - ich sah sie bisher als Standard - Funktionalität, bzw. ANSI SQL irgendwie doch zu recht erwarte.

Kurz zum MS SQL Server:
Ich habe bestimmt zwei Stunden nach einer Funktionalität zum Eintragen eines Datensatzes gesucht (Tabelle und Spalten konnte ich anlegen), aber nirgendwo was gefunden, obwohl ich jeden Menüpunkt durchgeschaut habe ...

Dabei ist es gar nicht mein Ansinnen jetzt groß einen auf Datenbank Admin zu machen, ich wollte lediglich eine kleine Testdatenbank aufbauen um meine ADO.NET Programmierung zu testen.

3.511 Beiträge seit 2005
vor 16 Jahren

Um manuell Datensätze zu manipulieren muss man im Management Studio die Tabelle Rechtsklicken und sagen "Tabelle öffnen". Sowas hättest du ja z.B. hier fragen können.

Es stimmt allerdings schon, das MS SQL um etliches mächtiger ist als mySQL, aber sowas darf man dann nicht auf einfache Syntaxprobleme zurückwälzen. Und ich denke mal es ist nicht SQL 92 konform, das man die ID Spalte mit einem "Leerwert" angeben kann, und das dann autom. dieser Wert sozusagen ignoriert wird. Aber naja.

Ich will die hier keine Vorwürfe machen, aber ich hab Vista auch nicht sofort in die Tonne geschmissen und gesagt es ist Sch***, nur weil ich nicht sofort eine Einstellung (wieder)gefunden habe 😉. Fragen kostet doch nichts...

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)