IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#][oracle]Croiser des données dans un GridView (System.Data.OracleClient.OracleException: ORA-01036) [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut [C#][oracle]Croiser des données dans un GridView (System.Data.OracleClient.OracleException: ORA-01036)
    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
    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 &quot;COMPOSANT_COLLECTE&quot; WHERE &quot;ID_COMP_COLLECTE&quot; = :original_ID_COMP_COLLECTE AND &quot;ID_MACHINE&quot; = :original_ID_MACHINE AND &quot;ID_TYPE_COMPOSANT&quot; = :original_ID_TYPE_COMPOSANT AND ((&quot;ID_APPLICATION&quot; = :original_ID_APPLICATION) OR (&quot;ID_APPLICATION&quot; IS NULL AND :original_ID_APPLICATION IS NULL)) AND &quot;NOM_COMPOSANT&quot; = :original_NOM_COMPOSANT" 
                    InsertCommand="INSERT INTO &quot;COMPOSANT_COLLECTE&quot; (&quot;ID_COMP_COLLECTE&quot;, &quot;ID_MACHINE&quot;, &quot;ID_TYPE_COMPOSANT&quot;, &quot;ID_APPLICATION&quot;, &quot;NOM_COMPOSANT&quot;) VALUES (ID_COMP_COLLECTE_SEQ.NEXTVAL, :ID_MACHINE, :ID_TYPE_COMPOSANT, :ID_APPLICATION, :NOM_COMPOSANT)" 
                    ProviderName="<%$ ConnectionStrings:XOUPDDviaClientOracle.ProviderName %>" 
                    SelectCommand="SELECT * FROM &quot;COMPOSANT_COLLECTE&quot;" 
                    UpdateCommand="UPDATE &quot;COMPOSANT_COLLECTE&quot; SET &quot;ID_MACHINE&quot; = :ID_MACHINE, &quot;ID_TYPE_COMPOSANT&quot; = :ID_TYPE_COMPOSANT, &quot;ID_APPLICATION&quot; = :ID_APPLICATION, &quot;NOM_COMPOSANT&quot; = :NOM_COMPOSANT WHERE &quot;ID_COMP_COLLECTE&quot; = :original_ID_COMP_COLLECTE AND &quot;ID_MACHINE&quot; = :original_ID_MACHINE AND &quot;ID_TYPE_COMPOSANT&quot; = :original_ID_TYPE_COMPOSANT AND ((&quot;ID_APPLICATION&quot; = :original_ID_APPLICATION) OR (&quot;ID_APPLICATION&quot; IS NULL AND :original_ID_APPLICATION IS NULL)) AND &quot;NOM_COMPOSANT&quot; = :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>
    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.

    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 :

    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 &quot;COMPOSANT_COLLECTE&quot; WHERE &quot;ID_COMP_COLLECTE&quot; = :original_ID_COMP_COLLECTE AND &quot;ID_MACHINE&quot; = :original_ID_MACHINE AND &quot;ID_TYPE_COMPOSANT&quot; = :original_ID_TYPE_COMPOSANT AND ((&quot;ID_APPLICATION&quot; = :original_ID_APPLICATION) OR (&quot;ID_APPLICATION&quot; IS NULL AND :original_ID_APPLICATION IS NULL)) AND &quot;NOM_COMPOSANT&quot; = :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>
    Ma grille me permet donc d'afficher les noms des objets.
    Par contre lorsque je tente une suppression (je n'ai modifié ni la commande, ni les paramètres) j'obtiens une erreur Oracle :

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

  2. #2
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    En explorant le contenu du dictionnaire de l’évènement RowDeleting j'ai découvert que mon dictionnaire embarque des données dont je n'ai pas besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID_COMP_COLLECTE=17;MACHINE=DSQW7052;APPLICATION=N/A;TYPE_COMPOSANT=PROCESSUS;ID_MACHINE=2;ID_TYPE_COMPOSANT=2;ID_APPLICATION=1;NOM_COMPOSANT=ssdfsdf;
    Pourtant les paramètres que je passe à ma source de données ne sont pas si nombreux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    <DeleteParameters>
                        <asp:Parameter Name="ID_COMP_COLLECTE" />
                        <asp:Parameter Name="ID_MACHINE" />
                        <asp:Parameter Name="ID_TYPE_COMPOSANT" />
                        <asp:Parameter Name="ID_APPLICATION" />
                        <asp:Parameter Name="NOM_COMPOSANT" />
                    </DeleteParameters>
    Est-ce normal ? Est-ce que je vais devoir recréer un dictionnaire dans l'évènement de suppression ?

    Je suis persuadé qu'il doit exister une méthode simple pour lier mes tables sans pour autant perdre la possibilité de suppression.

  3. #3
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    J'ai finalement résolu mon problème en modifiant la commande SQL de suppression.

    J'ai ajouté un BEGIN et un END sur la requête et tout fonctionne à nouveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                   DeleteCommand="BEGIN DELETE FROM COMPOSANT_COLLECTE WHERE ID_COMP_COLLECTE = :ID_COMP_COLLECTE; END;" > 
                    <DeleteParameters>
                        <asp:Parameter Name="ID_COMP_COLLECTE" />
                    </DeleteParameters>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/04/2013, 14h18
  2. modification des données dans un gridview
    Par marie-anne dans le forum VB.NET
    Réponses: 6
    Dernier message: 08/11/2010, 15h45
  3. Stockage des données dans un Gridview ?
    Par fx.92 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 04/11/2009, 23h53
  4. Configurer l'affichage des données dans un gridview
    Par Nuwanda dans le forum ASP.NET
    Réponses: 0
    Dernier message: 18/05/2009, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo