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

ADO.NET Discussion :

Hint /* materialize */ dans un CommandText


Sujet :

ADO.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut Hint /* materialize */ dans un CommandText
    Bonjour,

    J'utilise une version d'oracle 9i.
    Ma requête contient un hint /* materialize */ afin d'optimiser celle-ci.

    Cela fonctionne parfaitement lorsque j'utilise celle-ci dans l'application "Oracle SQL Developer".
    Par contre dans mon application console (Framework 4), lorsque j'attribue le texte de ma requête à la propriété "CommandText" d'un objet Command et que j'execute celle-ci, la materialisation ne semble pas être prise en compte.

    Ma question est : est-ce possible de materialiser les données à partir de CommandText depuis une application .Net ?

    Exemple de requête :

    SELECT /*+ materialize */ Name, Adress, Phone
    FROM User

    Merci d'avance.
    Christophe.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour,

    Citation Envoyé par ptit_tof57 Voir le message
    Ma question est : est-ce possible de materialiser les données à partir de CommandText depuis une application .Net ?
    A priori, ADO.Net envoie ta requête (après éventuelle remplacement des paramètres) as-is au SGBD. Plus généralement, tout ce que tu peux faire via SQL sur ton "shell" de SGBD peut être fait via ADO.Net, donc (bien que je ne connaisse pas ce "materialize") il n'y a pas de raison que cela ne fonctionne pas.
    SAUF, si "materialize" (je connais mal Oracle, a fortiori une ancienne version comme la 9g) est quelque chose d'interprêté par le shell et pas par le SGBD lui même.

    Je suppose qu'il existe sur Oracle un équivalent du profiler de Sql Server te permettant de voir les requêtes tel qu'elles arrivent au SGBD : vérifie à tout hasard que cette commande est bien transmise, malgré la syntaxe un peu "folklorique", avec le commentaire "façon C/C++". (qui pose peut être ici problème).

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Si tu utilises les drivers ODP.Net, y'a pas de raison que ca passe pas. J'utilise également des hints (même via NHibernate) et ca passe.

    BlueDeep: Le hint materialize est utilisé pour matérialiser une sous-requête. Une fois materialisée les accès vers cette sous requête sont plus rapide (mais materialiser beaucoup de données peut avoir un coût).

    Question pour ptit_tof57: Comment visualises tu qu'il n'y a pas matérialisation de ta sous requête? Quelle est ta vraie requête?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Merci pour vos réponses, je vais approfondir le sujet.

    Nathanael, est-ce que dans la chaîne de la requête, les "/" doivent être traités d'une certaine façon ? Commer par exemple pour un chemin @"C:\Windows" avec le @ devant.

    Pour voir que ma table n'est pas matérialisée, je le déduis par le temps d'execution qui est trop important...

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par ptit_tof57 Voir le message
    Merci pour vos réponses, je vais approfondir le sujet.

    Nathanael, est-ce que dans la chaîne de la requête, les "/" doivent être traités d'une certaine façon ? Commer par exemple pour un chemin @"C:\Windows" avec le @ devant.:
    A priori non, mais le "@" (chaine littérale) ne mange pas de pain.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Si c'est juste un Select sans sous-requêtes, le materialize n'a pas d'utilité. Il est surtout utile avec l'instruction WITH.
    D'ailleurs comme dit plus haut, une materialisation de sous requête peut être couteuse: exemple on a une partition oracle "pinnée" en memoire, (ie toute ma table est en mémoire), une matérialisation écrit ces données sur le disque donc dans ce cas, c'est mois valable.
    Le mieux serait de regarder les plans d'executions des requêtes.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Je viens de tester le @ devant la chaîne, même résultat, cela ne fonctionne pas...
    J'ai utiliser la chaîne obtenue par CommandText dans Oracle SQL Developper, et la tout fonctionne correctement...

    Voici comment se profil ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WITH all_users as (SELECT /*+ materialize */ Name, ID FROM   Users)
    SELECT DISTINCT Field1, Field2, (SELECT Name FROM all_users WHERE all_users.ID = Table1.ID) as "Users"
    FROM Table1
    Elle commence par "WITH", est-ce un problème pour ADO.Net ?
    Faut-il placer les Hints directement dans la requête, sans utiliser "WITH"

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par ptit_tof57 Voir le message
    Je viens de tester le @ devant la chaîne, même résultat, cela ne fonctionne pas...

    "cela ne fonctionne pas" n'est pas exactement un message d'erreur ADO.Net

    Que se produit il ? rien, exception, pas de résultat, etc ...

    Merci de préciser.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    En effet, voici le message d'erreur renvoyer par ADO.net :

    ORA-03113: end-of-file on communication channel
    Process ID: 0
    Session ID: 11 Serial number: 4138

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Etrange.

    peux tu poser le code d'exécution de ta requête ?

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Voici le code qui est exécuté :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
     if (export != null)
                {
                    using (this.connection = new OracleConnection(Settings.Default.DataConnectionStaging))
                    using (IDbCommand command = this.connection.CreateCommand())
                    {
                        command.CommandText = export.Query;
                        this.connection.Open();
     
                        using (IDataReader reader = command.ExecuteReader())
                        using (StreamWriter streamExport = new StreamWriter(export.Path, false, Encoding.UTF8))
                        {
                            // If the file need a header we write it in the first line of the file.
                            if (export.Header)
                            {
                                // Obtains the schema of the return table for get the headers columns names.
                                DataTable table = reader.GetSchemaTable();
     
                                // Write all headers in the export file.
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    streamExport.Write(table.Rows[i][0].ToString());
                                    streamExport.Write(export.Separator);
                                }
                            }
     
                            while (reader.Read())
                            {
                                // If no error with current record fields length or we don't want check the fields length.
                                if (export.CheckLength == false || CheckFieldsLenght(reader, export))
                                {
                                    // Write all fields in the export file.
                                    for (int i = 0; i < reader.FieldCount; i++)
                                    {
                                        streamExport.Write(reader[i].ToString());
                                        streamExport.Write(export.Separator);
                                    }
     
                                    streamExport.WriteLine();
                                }
                            }
                        }
                    }
                }

    C'est la ligne 9 qui me retourne l'erreur. Pour info, cette "portion" de code fonctionne parfaitement pour les autres requêtes de mon application.

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Essaye à tout hasard de virer les CR dans la chaine.

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Je viens d'essayer une requête inline, et toujours la même erreur.

    Je pense que mon Hint /*+ materialize */ n'est pas reconnu.

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Tu utilises le client de Oracle (ODP11) ou celui de Microsoft ?

  15. #15
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    J'utilise bien le client oracle 11, la base oracle est en version 9.2.0.7.0 et Framework 4.

    Je voulais tenter l'ancienne syntaxe des Hints --+ mais ceux-ci doivent être in line donc le reste de ma requête ne fonctionne pas.

  16. #16
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Essaye à tout hasard avec le client Microsoft (si ton code est codé proprement, tu n'as qu'à changer l'instanciation de l'objet connexion - et le "using" aussi bien sur).

  17. #17
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Pareil avec le client oracle de microsoft, le hint ne semble pas être interprété.

  18. #18
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Désolé, mais là je sèche, et n'ai pas le temps de faire un test tout de suite.

  19. #19
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Ok merci tout de même.
    Je sèche aussi...

  20. #20
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Un dernier point : il n'y a pas d'InnerException quand tu exalmines l'exception levée via Debugger ?

    Poste éventuellement la copie d'écran ou la sérialisation de l'exception complète.

    Sinon, sur l'erreur elle même on trouve ça :

    http://collecteddotnet.wordpress.com...wing-settings/

Discussions similaires

  1. Erreur hint="@String/ dans un fichier XML.
    Par Fourbartemis dans le forum Mon application mobile
    Réponses: 0
    Dernier message: 02/01/2015, 18h18
  2. Rechercher un texte dans le commandtext d'une ADODATASET
    Par StarMusic dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/09/2007, 16h25
  3. Réponses: 3
    Dernier message: 24/07/2006, 14h41
  4. Afficher un Hint dans une ListView
    Par Larion dans le forum C++Builder
    Réponses: 13
    Dernier message: 13/03/2005, 13h45
  5. probléme avec une date/string dans un CommandText
    Par critok dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/02/2005, 15h30

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