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

4D Discussion :

[JDBC] connexion a 4D avec Jdbc


Sujet :

4D

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut [JDBC] connexion a 4D avec Jdbc
    Bonjour a tous,

    Je suis actuellement sur un projet qui nécessite l'accès a une base 4D depuis une application java. Cependant je me retrouve confronté a certains problèmes.

    Dans un premier temps, j'essaye de remplire le champs date d'un enregistrement. J'execute la requete :

    INSERT INTO matable (dateDebut) values('12.12.2006') mais j'obtient l'erreur :

    java.sql.SQLException: com.fourd.jdbc.SQLTools::convert: Do not know how to convert String 12.12.2006 to Date.

    Après des heures d'essai, il semblerait que le seul format qu'il comprenne soit : 12 décembre 2006. J'ai essayé de faire comme pour les autres SGBD avec des to_Date('12.12.2006' , 'DD,MM,YYYY') mais il ne comprend pas la syntaxe.

    Quelqu'un a t'il une idée de comment faire cette simple requete ?

    Sinon, Est-ce que ceux qui ont déjà essayé d'attaquer 4D par ce biais ont aussi trouvé que c'était d'une lenteur impressionante ? un simple update d'un champs prend jusqu'à 2 secondes pour s'exécuter chez moi ... et j'en ai 10'000 a mettre a jour

    edit : J'utilise 4D server 2004.3

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 359
    Points : 613
    Points
    613
    Par défaut
    Je n'ai pas testé mais ce ne serait pas une erreur de format ?

    Vous avez essayé avec
    to_date('27/09/2006','DD/MM/YYYY')
    ou peut-etre
    to_date('27-09-2006','DD/MM/YYYY')
    --Steph4D

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Il ne me semble pas J'ai cela comme code :

    Connection conn;
    Properties props = new Properties();
    props.setProperty("user","designer");
    props.setProperty("password","mon_pass");

    Class.forName("com.fourd.jdbc.DriverImpl");

    Driver driver=DriverManager.getDriver("jdbc:4d:127.0.0.1");
    conn = driver.connect("jdbc:4d:127.0.0.1:19813", props);
    Statement stmt = conn.createStatement();

    String requete = "Insert into Destinataires (Date_Debut) values(to_date( '27/09/2006','DD/MM/YYYY'))";

    stmt.executeUpdate(requete);
    conn.close();

    Mais quand je l'execute, il me fait :

    java.lang.Exception: com.fourd.jdbc.SQLTokenizer::validateNextToken: Unexpected token - 27 expected , instead

    En gros la syntaxe n'est pas correcte quelle que soit ce que je met dans le to_date

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 359
    Points : 613
    Points
    613
    Par défaut
    Apparement, il faut utiliser les PreparedStatement.

    Voilà mon essai (soyez indulgents, je ne connais pas Java) :

    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
    import java.util.Date;
    import java.text.SimpleDateFormat;
    import java.sql.*;
    import java.util.Properties;
    import java.sql.Statement;
     
    public class testJavaDate2 {
    public static void main(String[] argv) {
     
    try {
    	Properties props = new Properties();
    	props.setProperty("user","");
    	props.setProperty("password","");
    	Class.forName("com.fourd.jdbc.DriverImpl");
    	Driver driver=DriverManager.getDriver("jdbc:4d:192.168.88.89");
    	Connection conn = driver.connect("jdbc:4d:192.168.88.89:19813", props);
    	//Statement stmt = conn.createStatement();
     
    	//String requete = ("Insert into TEST (f_date) values(to_date ('2006-03-03','DD/MM/yyyy')");
     
    	PreparedStatement pstmt = conn.prepareStatement("Insert into TEST
    (f_date) values(?)");
     
    	String aDateString = "27/09/2006";
    	SimpleDateFormat aFormatter = new SimpleDateFormat("dd/mm/yyyy");
    	Date aDate = aFormatter.parse(aDateString);
     
    	pstmt.setDate(1,new java.sql.Date(aDate.getDate()));
     
     
    	pstmt.executeUpdate();
     
    	conn.commit();
    	conn.close();
     
    	}
     
    catch (Exception e) {System.out.println(e); }
     
    }
    }
     
    // end
    Avec ça, j'ai un enregistrement créé dans la base 4D mais la date est 01/01/1970. C'est pas encore ça mais il y a du mieux
    Ca vous mettra peut-être sur la voie...
    --Steph4D

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 359
    Points : 613
    Points
    613
    Par défaut
    J'ai trouvé mon erreur dans mon code exemple :

    C'est pas :
    pstmt.setDate(1,new java.sql.Date(aDate.getDate()));

    Mais :
    pstmt.setDate(1,new java.sql.Date(aDate.getTime()));

    La création d'un record avec un champ marche impec comme ça avec le JDBC Driver.

    Testé avec le 4D JDBC Driver sous MacOsX et un 4D Serveur 2004.4 sous Windows XP.
    --Steph4D

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 359
    Points : 613
    Points
    613
    Par défaut
    Arf...
    Encore une petite correction :

    C'est pas :
    SimpleDateFormat aFormatter = new SimpleDateFormat("dd/mm/yyyy");

    Mais :
    SimpleDateFormat aFormatter = new SimpleDateFormat("dd/MM/yyyy");

    MM en majuscule sinon la date n'est pas correcte
    --Steph4D

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Ohhhh... tiens c'est une idée Je peux pas tester ce soir car je ne suis plus au boulot.. mais je fais l'essai demain 09h00

    Merci tout plein pour ton conseil en tout cas

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Oki cette requete marche parfaitement. Merci tout plein steph4d

    Par contre plus j'utilise ce driver jdbc plus je me rend compte qu'il est totallement moisi. Sur des Requetes SQL standard, il en comprend pas la moitié.

    Select * from ma table where Date IS NULL : il ne comprend pas is null
    Select max(Id) from MaTable : Invalide
    Select Id From Matable where Id = max(Id) : Invalide

    Et ca c'est des requetes simples... alors j'imagine pas quand je vais commencer a devoir faire des jointures etc. En gros, il me semble que 9 requêtes sur 10 ne sont pas valides ce qui rend ce driver jdbc complétement inutile.

    Je vais voir si j'ai moyen de faire autrement mais cela semble pas mal compromettre mon projet

    En tout cas merci pour la réponse efficace et rapide

    Au plaisir

  9. #9
    Membre habitué

    Inscrit en
    Juin 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 76
    Points : 131
    Points
    131
    Par défaut
    4D n'utilise pas pour le moment un moteur SQL, les requêtes entrantes sont donc traduites. Les drivers de type ODBC ou JDBC font ce qu'ils peuvent...mais avec beaucoup de limitations, de lenteur et d'erreurs.

    Pour ma part, je ne conseille pas cette approche, trop aléatoire.

    En ce qui concerne java, il peut être intéressant de jeter un oeil au package 4D Open For Java qui fournit lui un accès natif au moteur de BDD de 4D.
    C'est un peu déroutant pour un développeur Java, mais ça peut peut-être débloquer la situation...

    plus d'infos, ici : http://www.4d.fr/knowledgebase?CaseID=1560
    "
    4D s'ouvre sur Java

    Référence : 4D-200312-35-FR
    Produit : 4D
    Version : 2003
    Plateforme : Mac & Win

    Comment accéder à 4D depuis un programme écrit en Java ? La solution la plus immédiate passe par l’utilisation de 4D Open For Java, un produit de connectivité Java édité par 4D S.A. Nous présentons dans ce chapitre le produit lui-même, puis un exemple pour administrer à distance une application 4D. Nous tentons de décrire les principes de programmation, sans rentrer en profondeur dans de la programmation Java, ce qui dépasserait le cadre de cette note."

  10. #10
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    Salut,

    Le Web Service peut être une solution. Et peut être même plus rapide
    Tout dépend de l'utilisation en fait !

    Cyb.

  11. #11
    Membre habitué

    Inscrit en
    Juin 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 76
    Points : 131
    Points
    131
    Par défaut
    Ce n'est pas du tout équivalent !

    Un accès ODBC ou JDBC s'effectue au niveau physique sur les données, sans aucune modification nécessaire côté 4D.

    Pour mettre en place un service Web, il faut programmer. C'est une excellente solution technologique, mais ça ne s'improvise pas.

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Merci pour ta réponse ckeromen J'étais justement en train d'essayer de trouver des infos sur 4d open for java. J'ai lu la note et cela m'a l'air assez intéressant.

    Par contre j'ai 2 petits soucis.

    1) Ce projet est en fait mon travail de diplôme. J'ai 12 semaines pour le faire (plus que 10 maintenant) et j'ai peur de perdre pas mal de temps à apprendre à l'utiliser.

    2) Une partie de mon projet consistera a acceder à la base de donnée via wifi depuis des Palm et éventuellement telephones portables supportant java. Et la ca risque de poser un peu problème.

    Je vais étudier tout ca et réfléchir à la meilleure solutions.

    Encore merci a vous

  13. #13
    Membre habitué

    Inscrit en
    Juin 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 76
    Points : 131
    Points
    131
    Par défaut
    Une autre manière de voir les choses.
    Le driver ODBC ou JDBC fonctionne bien sur des requêtes simples mono-table. Tu peux l'utiliser pour cloner les tables intéressantes de ta base 4D sur une base MySQL ou autre, puis effectuer tes requête complexes sur ce clone. Ce n'est pas du temps réel, mais as-tu réellement besoin de temps réel ?

  14. #14
    Membre habitué Avatar de Cyberbob002
    Inscrit en
    Mai 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 140
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par ckeromen
    Ce n'est pas du tout équivalent !

    Un accès ODBC ou JDBC s'effectue au niveau physique sur les données, sans aucune modification nécessaire côté 4D.

    Pour mettre en place un service Web, il faut programmer. C'est une excellente solution technologique, mais ça ne s'improvise pas.
    Je n'ai pas dis que ca l'était
    Mais si il y a des traitements complexes à faire, ce sera peut être plus rapide à développer coté 4D que coté java, surtout si il ne peut faire que des requêtes simple et mono-table.

    Maintenant, d'autres paramètres entre dans le choix :
    * possibilité de modifier 4D
    * connaissance du langage 4D ! Car il y a un temps d'adaptation non négligeable je trouve.
    * ...

  15. #15
    Membre habitué

    Inscrit en
    Juin 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 76
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par Cyberbob002
    Maintenant, d'autres paramètres entre dans le choix :
    * possibilité de modifier 4D
    * connaissance du langage 4D ! Car il y a un temps d'adaptation non négligeable je trouve.
    * ...
    on est bien d'accord

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

Discussions similaires

  1. Connexion à MySQL Workbench avec JDBC
    Par nisssou dans le forum JDBC
    Réponses: 2
    Dernier message: 13/09/2013, 19h56
  2. Problème connexion BDD MySql avec jdbc
    Par libery dans le forum JDBC
    Réponses: 6
    Dernier message: 27/05/2009, 12h25
  3. [JDBC]connexion avec sql server
    Par ridondo dans le forum JDBC
    Réponses: 1
    Dernier message: 26/09/2005, 22h37
  4. Réponses: 1
    Dernier message: 25/09/2005, 16h18
  5. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37

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