Récupération ID après INSERT retourne NULL
Salut à toutes et à tous,
Je cherche depuis un bon moment ce qui ne va pas dans mon code, mais je ne trouve pas, même après avoir lu plusieurs 10aines de sites/posts parlant du sujet, aussi je fais appel à vous.
J'ai une base de donnée PostgreSQL dans laquelle j'ai créé une fonction qui insère une ligne dans 2 tables et me retourne l'ID d'un des éléments créés.
Losque j'exécute la fonction sous postgreSQL, elle me retourne bien le nouvel ID et les éléments sont bien créés.
Tout va donc bien du côté de PostgreSQL.
Dans ma page ASP j'ai un SQLDataSource avec un paramètre ReturnValue pour récupérer le fameux ID retourné par la fonction.
Sur l'event Inserted j'ai un code qui devrait alimenter un champs texte avec le nouvel ID, or e.Command.Parameters["New_ID"].Value me retourne une valeur nulle
Ce qui me chipotte un peu, c'est qu'en PostgreSQL, pour appeler une fonction il faut utiliser un select, et je me demande si le pbl ne viendrait pas de là. Directement dans PostgreSQL j'appelle "SELECT reno_modifsl3_insert_modif_et_lot_lie("TexteAIntroduire", IntegerAIntroduire, NumericAIntroduire)" et il me retourne l'ID.
J'ai donc écris ceci, mais le retour de l'ID a l'air null:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<asp:SqlDataSource ID="SqlDataSource_Reno_ModifsL3_ModifsParNouvLot"
runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString_ODBC_Topocom %>"
InsertCommandType ="StoredProcedure"
InsertCommand="SELECT reno_modifsl3_insert_modif_et_lot_lie(?, ?, ?)"
ProviderName="<%$ ConnectionStrings:ConnectionString_ODBC_Topocom.ProviderName %>"
SelectCommand='SELECT topocom."public".reno_modifs_apres_l3.modifl3_id, topocom."public".reno_modifs_apres_l3.modification FROM topocom."public".reno_modifs_apres_l3, topocom."public".reno_nouv_lots_modifs_apres_l3 WHERE topocom."public".reno_modifs_apres_l3.modifl3_id = topocom."public".reno_nouv_lots_modifs_apres_l3.modifl3_id AND (topocom."public".reno_nouv_lots_modifs_apres_l3.num_nouv_lot = ?) ORDER BY topocom."public".reno_modifs_apres_l3.modifl3_id' OnInserted="SqlDataSource_Reno_ModifsL3_ModifsParNouvLot_Inserted">
<SelectParameters>
<asp:ControlParameter ControlID="ListBox_Reno_ModifsL3_Nouv_Lots" Name="?" PropertyName="SelectedValue" />
</SelectParameters>
<InsertParameters>
<asp:ControlParameter ControlID="TextBox_Reno_ModifL3_Description" Name="?" PropertyName="Text" />
<asp:ControlParameter ControlID="TextBox_UserID" Name="?" PropertyName="Text" />
<asp:ControlParameter ControlID="ListBox_Reno_ModifsL3_Nouv_Lots" Name="?" PropertyName="SelectedValue" />
<asp:Parameter Direction="ReturnValue" Name="id_modif" Type="Int32" />
</InsertParameters>
</asp:SqlDataSource> |
Code:
1 2 3 4 5
|
protected void SqlDataSource_Reno_ModifsL3_ModifsParNouvLot_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
TextBox_Reno_ModifsL3_modif_id.Text = Server.HtmlEncode(e.Command.Parameters["New_ID"].Value.ToString());
} |
Quelqu'un a-t-il une idée de ce que je dois faire pour récupérer ce :furieux: de ID ?
Merci de vos z'avis z'avisés,
Jean-Marc
Le problème ne semble pas venir de PostgreSQL
J'ai modifié mon SQLDataSource et j'ai refait l'insert en texte dans une seule table pour voir si c'est au niveau de la procédure stockée ou de son appel que ça coince.
L'ajout se fait bien au serveur, mais
e.Command.Parameters["New_ID"].Value me retourne toujours {}, or ici je n'appelle même plus une procédure stockée.
C'est normal qu'il ne me retourne pas l'ID puisque c'est un simple insert et non une procédure stockée qui retourne l'id, mais il me semble qu'il devrait retourner 1 ou -1 selon que l'insert à réussi ou pas.
Voici ce qui me retourne ce vide :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<asp:SqlDataSourceID="SqlDataSource_Reno_ModifsL3_ModifsParNouvLot"
runat="server"ConnectionString="<%$ ConnectionStrings:ConnectionString_ODBC_Topocom %>"
SelectCommand='SELECT topocom."public".reno_modifs_apres_l3.modifl3_id, topocom."public".reno_modifs_apres_l3.modification FROM topocom."public".reno_modifs_apres_l3, topocom."public".reno_nouv_lots_modifs_apres_l3 WHERE topocom."public".reno_modifs_apres_l3.modifl3_id = topocom."public".reno_nouv_lots_modifs_apres_l3.modifl3_id AND (topocom."public".reno_nouv_lots_modifs_apres_l3.num_nouv_lot = ?) ORDER BY topocom."public".reno_modifs_apres_l3.modifl3_id'
InsertCommand='INSERT INTO "public".reno_modifs_apres_l3(modification, employe_id) VALUES (?, ?)'
UpdateCommand='UPDATE "public".reno_modifs_apres_l3 SET modification = ? WHERE (modifl3_id = ?)'
ProviderName="System.Data.Odbc"
OnInserted="SqlDataSource_Reno_ModifsL3_ModifsParNouvLot_Inserted">
<SelectParameters>
<asp:ControlParameterControlID="ListBox_Reno_ModifsL3_Nouv_Lots"Name="?"PropertyName="SelectedValue"/>
</SelectParameters>
<InsertParameters>
<asp:ControlParameterControlID="TextBox_Reno_ModifL3_Description"Name="?"PropertyName="Text"/>
<asp:ControlParameterControlID="TextBox_UserID"Name="?"PropertyName="Text"/>
<asp:ParameterDirection="ReturnValue"Name="New_ID"Type="Int32"/>
</InsertParameters>
<UpdateParameters>
<asp:ControlParameterControlID="TextBox_Reno_ModifL3_Description"Name="?"PropertyName="Text"/>
<asp:ControlParameterControlID="TextBox_Reno_ModifsL3_modif_id"Name="?"PropertyName="Text"/>
</UpdateParameters>
</asp:SqlDataSource>
|
Code:
1 2 3 4 5
|
protectedvoid SqlDataSource_Reno_ModifsL3_ModifsParNouvLot_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
TextBox_Reno_ModifsL3_modif_id.Text = Server.HtmlEncode(e.Command.Parameters["New_ID"].Value.ToString());
} |
Je n'y comprend rien.
Qu'est ce qui ne va pas ?
Jean-Marc