J'essaie d'insérer une ligne dans une table PostgreSQL avec une clé primaire série et j'ai besoin de récupérer cette colonne après avoir été insérée. J'ai quelque chose comme ça:
La table "Pais" a 3 colonnes: ID, PAIS, Capital; ID est une colonne de série et est sa clé primaire. p> Il insère la ligne sur la table mais "res" est null. Si j'insère avec le Nexval ('Table_SuRence ») renvoie également NULL. P> Une idée de comment puis-je retourner l'identifiant de la table? Je manque quelque chose? P> Merci d'avance p> p>
4 Réponses :
L'insert lui-même ne provoque pas une valeur de retour. Lorsque vous effectuez ExecutesCalar, il recherche une valeur unique pour être "sélectionnée" pour ainsi dire. p>
Je pense que vous devez suivre votre insert avec une instruction SELECT pour résoudre votre problème.
Si vous utilisiez T-SQL, vous le feriez comme si p>
chaîne sql = "Insérez des valeurs [Tableau] (Nom de champ) (@paramname);" + "Sélectionnez Cast (Scope_Identity () comme int)"; P>
ExécutesCalar retournerait alors l'identifiant unique; p>
Je ne suis pas sûr de la syntaxe exacte pour PostgreSQL, mais j'espère que cela vous permet de résoudre votre problème. p>
Merci, je vais vérifier comment faire ça sur Postgres
Il devrait s'agir de la chaîne SQL = "Insérer dans les valeurs [Tableau] (nom de champ) (@paramname);" + "Sélectionnez Cast (Lastval () comme entier)";
Super. Merci pour la clarification de la syntaxe exacte. Désolé. J'ai été perdu dans SQL Server Terre depuis des années. :)
Ne t'inquiète pas. Cela m'a donné l'idée.
perdu dans la traduction SQL peut-être?
Pour sélectionner la dernière identité insérée, vous devez utiliser: Votre instruction SELECT doit donc ressembler à: P> Curval (SEQUENCENNAME) CODE>
NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);
Excellent! J'ai essayé avec Lastval () et travaille mais sans la ligne Query.Prepare (), tout comme le poste que vous avez lié. Merci!
Je m'attendrais à ce que "insertion dans la table (noms de champs) (valeurs) renvoie idcolumn?" De @mlapaglia est une bien meilleure solution.
est ce fil sûr?
Et si un autre insert se produit entre votre insert et sélectionnez-vous?
Pourquoi ne pas utiliser: p>
Insérer dans la table (noms de champ) Valeurs (valeurs) Renvoyer IDCOLUMN CODE>? P>
Il s'agit de fil de sécurité si le Select est dans la même requête parce que c'est dans la même "session", de postgreSQL.org/docs/8.4/interactive/fonctions-Sonctionnel.html : "Parce que cela renvoie une valeur de session-locale, elle donne une réponse prévisible si d'autres sessions ont été exécutées ou non Nextval depuis la session en cours. "
La réponse acceptée n'a pas fonctionné pour moi. Celui-ci l'a fait, alors merci de l'ajouter.
Merci! Travaillé pour moi aussi.
Pourquoi est-ce que parfois il renvoie -1 Même s'il a créé un enregistrement dans la DB?
Object res = query.ExecuteScalar();
Merci, ça a fonctionné. Vous devez le jeter trop longtemps: long litimode = (long) CommandObj.exectesCalar ();
Je ne lis pas votre requête comme "Sélection de" une valeur de retour comme scalaire?