Abrufen der Seriennummer ID mit Npgsql beim einfügen mit ExecuteScalar
Ich versuche, einfügen einer Zeile in eine PostgreSQL-Tabelle mit einer serial primary key, und ich brauche zum abrufen dieser Spalte, nachdem es eingefügt wurde. Ich habe so etwas wie dieses:
Den Tisch "pais" hat 3 Spalten: id, pais, Hauptstadt; id ist eine serial-Spalte und ist Primärschlüssel.
NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital)", conn);
query.Parameters.Add(new NpgsqlParameter("nombre", NpgsqlDbType.Varchar));
query.Parameters.Add(new NpgsqlParameter("capital", NpgsqlDbType.Varchar));
query.Prepare();
query.Parameters[0].Value = this.textBox1.Text;
query.Parameters[1].Value = this.textBox2.Text;
Object res = query.ExecuteScalar();
Console.WriteLine(res);
Es fügt die Zeile auf den Tisch, aber "res" - Wert null ist. Wenn ich das einfügen mit der nexval('table_sequence') auch den Wert null zurück.
Jede Idee, wie kann ich wieder die id von der Tabelle? Bin ich etwas fehlt?
Vielen Dank im Voraus
Ich glaube nicht, Lesen Sie Ihre Abfrage wie "die Auswahl" beliebige Wert, der zurückgegeben wird als Skalare?
InformationsquelleAutor Cheluis | 2011-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Damit wählen Sie die Letzte Identität eingefügt, die Sie verwenden müssen:
currval(sequencename)
also deine select-Anweisung sollte wie folgt Aussehen:
Ich würde erwarten, dass die "INSERT INTO Tabelle (Feldnamen) WERTE (values) ZURÜCKGEBEN idcolumn?" von @mlapaglia ist eine viel bessere Lösung.
InformationsquelleAutor Cos Callis
Ist, dass thread-sicher?
Was ist, wenn ein anderes einfügen geschieht zwischen Ihren insert-und select?
Warum nicht:
INSERT INTO table (fieldnames) VALUES (values) RETURNING idcolumn
?es ist thread-sicher, wenn die wählen Sie ist in der gleichen Abfrage, weil es in der gleichen "Sitzung", die von postgresql.org/docs/8.4/interactive/functions-sequence.html: "Denn das ist wieder eine Sitzung-lokalen Wert, es gibt eine vorhersagbare Antwort, ob oder nicht andere Sitzungen ausgeführt haben nextval, da die aktuelle Sitzung hat."
Die akzeptierte Antwort hat bei mir nicht funktioniert. Diese hat man, also danke für das hinzufügen.
Danke!!! Arbeitete für mich auch.
Warum ist es, dass es manchmal gibt -1 zurück, obwohl es erstellt einen Datensatz in der DB?
InformationsquelleAutor hsmiths
ersetzen
id
mit Ihrem Primärschlüsselenter code here
und verwendenInnen
res
haben Sie die PK.InformationsquelleAutor Wave
Einfügen selbst nicht dazu führen, ein Wert zurückgegeben werden. Wenn Sie ausführen ExecuteScalar es ist die Suche nach einem einzelnen Wert zu werden "Ausgewählt", so zu sprechen.
Ich glaube, dass müssen Sie Folgen, bis Sie Ihren Einsatz mit einer select-Anweisung, um Ihr Problem zu lösen.
Wenn Sie wurden mit Hilfe von t-sql würden Sie das wie so
string sql =
"INSERT INTO [Tabelle] (Feldname) VALUES (@ParamName);"
+ "SELECT CAST(scope_identity() AS int)";
ExecuteScalar würde dann wieder die eindeutige id;
Ich bin nicht sicher, ob die genaue syntax für postGresql, aber hoffentlich wird dies ermöglicht es Ihnen, Ihr Problem zu lösen.
Es sollte string sql = "INSERT INTO [Tabelle] (Feldname) VALUES (@ParamName);" + "SELECT CAST(lastval() AS integer)";
Toll. Vielen Dank für die Klärung der genauen syntax. Sorry. Ich habe verloren, in der sql server-land für die Jahre. 🙂
Mach dir keine sorgen. Es gab mir die Idee.
verloren in SQL die übersetzung vielleicht?
InformationsquelleAutor Matt