10
votes

Récupérer une carte d'identité série avec NPGSQL lors de l'insertion avec ExecuteCalar

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. xxx

Il insère la ligne sur la table mais "res" est null. Si j'insère avec le Nexval ('Table_SuRence ») renvoie également NULL.

Une idée de comment puis-je retourner l'identifiant de la table? Je manque quelque chose?

Merci d'avance


1 commentaires

Je ne lis pas votre requête comme "Sélection de" une valeur de retour comme scalaire?


4 Réponses :


3
votes

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.

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

chaîne sql = "Insérez des valeurs [Tableau] (Nom de champ) (@paramname);" + "Sélectionnez Cast (Scope_Identity () comme int)";

ExécutesCalar retournerait alors l'identifiant unique;

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.


5 commentaires

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?



6
votes

Pour sélectionner la dernière identité insérée, vous devez utiliser: Curval (SEQUENCENNAME) CODE>

Votre instruction SELECT doit donc ressembler à: P>

NpgsqlCommand query = new NpgsqlCommand("insert into pais(nombre, capital) values(@nombre, @capital);select currval('table_sequence');", conn);


2 commentaires

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.



27
votes

est ce fil sûr?
Et si un autre insert se produit entre votre insert et sélectionnez-vous? Pourquoi ne pas utiliser:

Insérer dans la table (noms de champ) Valeurs (valeurs) Renvoyer IDCOLUMN ?


4 commentaires

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?



19
votes
Object res = query.ExecuteScalar();

1 commentaires

Merci, ça a fonctionné. Vous devez le jeter trop longtemps: long litimode = (long) CommandObj.exectesCalar ();