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

Doctrine2 PHP Discussion :

[Pas de solution possible] Doctrine2, DBLib et les dates


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Par défaut [Pas de solution possible] Doctrine2, DBLib et les dates
    Bonjour à tous,

    je voudrais utiliser Doctrine 2 pour gérer l'accès aux données d'une base SQL Server depuis une machine Linux (Centos), mais je bute sur un gros problème : la gestion des dates.

    Déjà, mon serveur Linux ne dispose que du driver PDO "DbLib" et ODBC. Du coup, j'ai été obligé de créer un driver pour "dblib". Seulement, ma configuration me retourne les dates au format M d Y H:i:s:uA (ex : "Oct 01 2012 15:27:32:000000AM"), ce qui générait une erreur d'interprétation des formats Datetime.
    J'ai donc surcharger la platform SQLServer pour retourner le format M d Y H:i:s:uA (méthode getDateTimeFormatString()), ce qui m'a permis de faire mes sélections sans problème.

    Le "hic", c'est que le format de sortie de mes dates est donc M d Y H:i:s:uA, et ce fuc#@* SQL Server ne comprend que le format Y-m-d H:i:s.u ce qui m'empêche de faire des filtrages sur des dates ou des mises à jour avec des dates !

    Quelqu'un sur cette terre a-t-il rencontré ce problème, et comment l'a-t-il résolu ? Suis-je le seul avec faire du doctrine 2 sur SQL Server via Linux ??

    Merci d'avance pour votre aide constructive

    Frédéric

    PS : Evitez la blague "change de SGBDR", car elle n'est pas drôle

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    je ne sais pas si cela peut t'aider:
    Doctrine assumes that you use DateTime2 data-types. If your legacy database contains DateTime datatypes then you have to add your own data-type (see Basic Mapping for an example).
    http://docs.doctrine-project.org/en/...trine-datetime

    à priori ils suggère de créer un type DateTime personalisé pour transformer la valeur de la BDD en objet DateTime PHP
    http://docs.doctrine-project.org/en/...-mapping-types

  3. #3
    Membre éclairé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Par défaut
    Bon, je constate que DbLib convertie automatiquement les dates en sortie. Pour avoir un format plus "standard", j'ai modifié dans /etc/locales.conf le format de sortie, mais j'ai peur d'impacter d'autres applications.

    Du coup, j'ai créé un type "DbLibDateTime" qui semble remplir la fonction, mais j'ai un nouveau problème.
    J'avais créé un format avec des microsecondes, seulement, SQL Server n'en veut pas en entrée (convertToDarabaseValue), j'ai fait le changement dans le type, mais depuis, étrangement, le format est toujours en entrée avec les microsecondes et ne prend plus en compte mes modifications !?!

    J'ai même mis un "die" dans "convertToDatabaseValue", et la méthode ne semble plus appelée. Doctrine gère un "cache" ?

    (pour info, je suis en mode "CLI", donc pas de problème avec APC)

  4. #4
    Membre éclairé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Par défaut
    Bon, après analyse, je constate que Doctrine 2 (ce n'est pas le cas de Doctrine 1) n'est pas en mesure d'utiliser DbLib.

    En effet, lors de l’exécution d'un requête DQL avec un "getResult", si l'objet contient une association, D2 va exécuter une nouvelle requête pour chaque ligne de résultat, ce qui n'est pas possible avec DbLib (SQL Server) et génère une exception : "Attempt to initiate a new Adaptive Server operation with results pending" (ligne 641 de Doctrine\DBAL\Connection).

    Bon, ben "byebye" Doctrine 2

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Par défaut
    Si si c'est possible, j'utilise Doctrine 2 avec SQL Server 2005 et 2008 sur environnements Linux et Windows avec DBLib, et ça fonctionne (testé avec des objets avec des associations, eager ou lazy, et différents types de requêtes).
    En ce qui concerne les dates, je me suis créé mon propre type doctrine et y a pas de soucis :
    Cette classe convertit le datetime SqlServer en timestamp, et inversement :
    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
    44
    45
    46
    47
     
    use Doctrine\DBAL\Types\Type;
    use Doctrine\DBAL\Platforms\AbstractPlatform;
     
    /**
     * My custom datatype.
     */
    class MsDateTimeType extends Type
    {
        const TYPE = 'MsDateTime';
     
        public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
        {
            return $platform->getDateTimeTypeDeclarationSQL($fieldDeclaration);
        }
     
        public function convertToPHPValue($value, AbstractPlatform $platform)
        {
            if (!$value) {
                return null;
            }
            if (!is_int($value)) {
                $value = strtotime($value);
            }
            if ($value === false)
                return null;
            return $value;
        }
     
        public function convertToDatabaseValue($value, AbstractPlatform $platform)
        {
            if (!$value) {
                return null;
            }
            if (!is_int($value)) {
                $value = strtotime($value);
            }
            if ($value === false)
                return null;
            return date($platform->getDateTimeFormatString(), $value);
        }
     
        public function getName()
        {
            return self::TYPE;
        }
    }
    Donc si c'est pas trop tard, tu peux revenir à Doctrine 2.
    Bon courage ^^

Discussions similaires

  1. Remplissage matrice, toutes les solutions possibles
    Par corky813 dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 16/06/2011, 11h25
  2. 3dsmax, maya vers .X ? ? ? pas de solution
    Par supergrey dans le forum DirectX
    Réponses: 1
    Dernier message: 06/03/2007, 17h01
  3. ça ne marche tjrs pas messieurs , avec les dates
    Par tobisko dans le forum Access
    Réponses: 1
    Dernier message: 29/12/2006, 11h55
  4. [Tomcat] [JAAS] Des idées mais pas de solution concrètes
    Par cgougeon dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 27/09/2005, 14h22

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