Bonjour,
Je vais essayer d'expliquer le problème que je rencontre de mon mieux, mais ça va faire du texte, par avance je m'en excuse.
J'ai 4 tables dans une BDD oracle:
- 3 tables simples qui contiennent un identifiant et une valeur (Un nom) : Type_Composant, Application, Machine
- 1 table qui contient un identifiant, un nom et des identifiants dans les 3 autres tables. Composant_Collecte
Ca donne a peu prêt ça :
TYPE_COMPOSANT [ID_TYPE_COMPOSANT:NUMBER(3), TYPE_COMPOSANT:VARCHAR2(50)]
APPLICATION [ID_APPLICATION:NUMBER(3), APPLICATION:VARCHAR2(50)]
MACHINE [ID_MACHINE:NUMBER(3), MACHINE:VARCHAR2(50)]
COMPOSANT_COLLECTE [ID_COMPOSANT_COLLECTE:NUMBER(3), ID_MACHINE:NUMBER(3), ID_APPLICATION:NUMBER(3), ID_TYPE_COMPOSANT:NUMBER(3), NOM_COMPOSANT:VARCHAR2(50) ]
J'ai commencé par la création d'un sqlDataSource simple via le Wizard qui pointe sur COMPOSANT_COLLECTE
Je l'ai fait pointé vers un formview que j'ai modifié pour avoir des listes déroulantes qui permettent à l'utilisateur de choisir les noms des objets plutôt que leurs ID lors de l'insertion, et tout fonctionne bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 <asp:SqlDataSource ID="OraCompCollecte" runat="server" ConnectionString="<%$ ConnectionStrings:XOUPDDviaClientOracle %>" DeleteCommand="DELETE FROM "COMPOSANT_COLLECTE" WHERE "ID_COMP_COLLECTE" = :original_ID_COMP_COLLECTE AND "ID_MACHINE" = :original_ID_MACHINE AND "ID_TYPE_COMPOSANT" = :original_ID_TYPE_COMPOSANT AND (("ID_APPLICATION" = :original_ID_APPLICATION) OR ("ID_APPLICATION" IS NULL AND :original_ID_APPLICATION IS NULL)) AND "NOM_COMPOSANT" = :original_NOM_COMPOSANT" InsertCommand="INSERT INTO "COMPOSANT_COLLECTE" ("ID_COMP_COLLECTE", "ID_MACHINE", "ID_TYPE_COMPOSANT", "ID_APPLICATION", "NOM_COMPOSANT") VALUES (ID_COMP_COLLECTE_SEQ.NEXTVAL, :ID_MACHINE, :ID_TYPE_COMPOSANT, :ID_APPLICATION, :NOM_COMPOSANT)" ProviderName="<%$ ConnectionStrings:XOUPDDviaClientOracle.ProviderName %>" SelectCommand="SELECT * FROM "COMPOSANT_COLLECTE"" UpdateCommand="UPDATE "COMPOSANT_COLLECTE" SET "ID_MACHINE" = :ID_MACHINE, "ID_TYPE_COMPOSANT" = :ID_TYPE_COMPOSANT, "ID_APPLICATION" = :ID_APPLICATION, "NOM_COMPOSANT" = :NOM_COMPOSANT WHERE "ID_COMP_COLLECTE" = :original_ID_COMP_COLLECTE AND "ID_MACHINE" = :original_ID_MACHINE AND "ID_TYPE_COMPOSANT" = :original_ID_TYPE_COMPOSANT AND (("ID_APPLICATION" = :original_ID_APPLICATION) OR ("ID_APPLICATION" IS NULL AND :original_ID_APPLICATION IS NULL)) AND "NOM_COMPOSANT" = :original_NOM_COMPOSANT" ConflictDetection="CompareAllValues" OldValuesParameterFormatString="original_{0}"> <DeleteParameters> <asp:Parameter Name="original_ID_COMP_COLLECTE" Type="Decimal" /> <asp:Parameter Name="original_ID_MACHINE" Type="Decimal" /> <asp:Parameter Name="original_ID_TYPE_COMPOSANT" Type="Decimal" /> <asp:Parameter Name="original_ID_APPLICATION" Type="Decimal" /> <asp:Parameter Name="original_NOM_COMPOSANT" Type="String" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="ID_MACHINE" Type="Decimal" /> <asp:Parameter Name="ID_TYPE_COMPOSANT" Type="Decimal" /> <asp:Parameter Name="ID_APPLICATION" Type="Decimal" /> <asp:Parameter Name="NOM_COMPOSANT" Type="String" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="ID_MACHINE" Type="Decimal" /> <asp:Parameter Name="ID_TYPE_COMPOSANT" Type="Decimal" /> <asp:Parameter Name="ID_APPLICATION" Type="Decimal" /> <asp:Parameter Name="NOM_COMPOSANT" Type="String" /> <asp:Parameter Name="original_ID_COMP_COLLECTE" Type="Decimal" /> <asp:Parameter Name="original_ID_MACHINE" Type="Decimal" /> <asp:Parameter Name="original_ID_TYPE_COMPOSANT" Type="Decimal" /> <asp:Parameter Name="original_ID_APPLICATION" Type="Decimal" /> <asp:Parameter Name="original_NOM_COMPOSANT" Type="String" /> </UpdateParameters> </asp:SqlDataSource>
Ensuite j'ai créer une Gridview que j'ai liée à ma DataSource et à laquelle j'ai ajouter une colonne pour supprimer les enregistrements.
Une fois encore, tout cela fonctionne.
Par contre, la GridView affiche les identifiants des composants/machines/applications, plutôt que leurs noms, et cela ne me convient pas.
J'ai donc recréer une autre source de données (sqlDataSource toujours) et j'ai modifié la requête de sélection pour obtenir les noms des composants :
Ma grille me permet donc d'afficher les noms des objets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <asp:SqlDataSource ID="oraCompCollecteVueGrid" runat="server" ConnectionString="<%$ ConnectionStrings:XOUPDDviaClientOracle %>" DeleteCommand="DELETE FROM "COMPOSANT_COLLECTE" WHERE "ID_COMP_COLLECTE" = :original_ID_COMP_COLLECTE AND "ID_MACHINE" = :original_ID_MACHINE AND "ID_TYPE_COMPOSANT" = :original_ID_TYPE_COMPOSANT AND (("ID_APPLICATION" = :original_ID_APPLICATION) OR ("ID_APPLICATION" IS NULL AND :original_ID_APPLICATION IS NULL)) AND "NOM_COMPOSANT" = :original_NOM_COMPOSANT" ProviderName="<%$ ConnectionStrings:XOUPDDviaClientOracle.ProviderName %>" SelectCommand="SELECT Nom_Composant, Machine, Type_Composant, Application, ID_Type_Composant, ID_Machine, ID_Application, ID_Comp_Collecte FROM Machine M, Type_Composant Tc, Application A, Composant_Collecte Cc WHERE Cc.ID_Type_Composant = Tc.ID_Type_Composant AND Cc.ID_Machine = M.ID_Machine AND Cc.ID_Application = A.ID_Application"> <DeleteParameters> <asp:Parameter Name="original_ID_COMP_COLLECTE" Type="Decimal" /> <asp:Parameter Name="original_ID_MACHINE" Type="Decimal" /> <asp:Parameter Name="original_ID_TYPE_COMPOSANT" Type="Decimal" /> <asp:Parameter Name="original_ID_APPLICATION" Type="Decimal" /> <asp:Parameter Name="original_NOM_COMPOSANT" Type="String" /> </DeleteParameters> </asp:SqlDataSource>
Par contre lorsque je tente une suppression (je n'ai modifié ni la commande, ni les paramètres) j'obtiens une erreur Oracle :
Je ne comprends pas d'ou cela provient, et je n'arrive pas a récupérer la requête de suppression dans l'event RowDeleting..ORA-01036: illegal variable name/number
Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails de l'exception: System.Data.OracleClient.OracleException: ORA-01036: illegal variable name/number
Partager