Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

JAVA : Connexion via JDBC-ODBC à ma BDD MySQL

  onigami, le lundi 25 février 2008 à 18:39:52
Bonjour,

Je tiens tous d'abord à vous remercier d'avance pour l'aide que vous m'apporteriez.

Je suis étudiant en IUT. Je dois monter un gros projet : un site internet communautaire (Content Management Systems) comportant une base de donnée. J'utilise un pont JDBC-ODBC pour me connecter à ma base.
Je n'arrive pas à établir la connexion à partir de mon application java à ma base de données.

Mon infrastructure réseau:

Serveur :
- Basé physiquement dans l'IUT et logiquement sur le réseau de l'IUT et sous-réseau de la filière SRC (10.0.0.46.src.iut-velizy.uvsq.fr)
- Accessible depuis l'extérieur via tunnel SSH utilisant un alias interne "emotion" redirigeant vers le serveur (IP=10.0.0.46 sur le réseau de l'IUT).

NB : Ici le tunnel SSH marche sans aucun problème avec mes identifiants.
J'utilise PuTTY configuré de la façon suivante :
SESSION = port: 22 (sftp), hôte: monlogin@res.iut-velizy.uvsq.fr et mon mdp pour me connecter à ma session sur le reseau de l'IUT.
TUNNEL SSH = port source: 5000, serveur: emotion:80


Ma BDD:

Type = MySQL
Nom = freez
Localisation = localhost (celui de mon serveur)
Utilisateurs MySQL = admin [tous les droits], hote [droits restreints à l'écriture / lecture / modification / suppression de données] (chaque utilisateur ne pourra modifier que les entrées correspondants à son id)


Le pont ODBC-JDBC

J'ai installé l'interface ODBC sur mon serveur Linux (Debian) [Note aux linuxiens = j'utilise mandriva et ubuntu personnellement donc pas de réflexions "ubuntu c'est mieux ou autre!" merci ;)]

Je l'ai configurée en console grâce à ce tuto : http://www.linuxplusvalue.be/mylpv.php?id=118

Voici les fichiers de config:

/etc/odbcinst.ini

[MySQL]
Description	= ODBC Driver for MySQL
Driver		= /usr/lib/odbc/libmyodbc.so
Setup		= /usr/lib/odbc/libodbcmyS.so
FileUsage		= 1
CPTimeout		=
CPReuse		=



/etc/odbc.ini

[MySQL-test]
Description	= MySQL database test
Driver		= MySQL
Server		= localhost
Database	= freez
Port		= 5000
Socket		=
Option		=
Stmt		=



J'ai testé l'interface ODBC sur le serveur grâce à la commande isql MySQL-test admin mdp
J'arrive à me connecter.


Mon Client JAVA

Après toutes ces informations pré requises, voici le code du client java :

Ce dernier est séparé en 3 classes : Appli [Principale], PanneauConfig et PanneauPhrase.

Appli
Cette classe contient l'interface dans le constructeur (des zones de textes correspondants aux instructions select, from, where, group, order qui seront insérées dans les requêtes SQL grâce à la classe PanneauPhrase), charge le driver "sun.jdbc.odbc.JdbcOdbcDriver", établit la connection à la BDD selon les paramètres retournés par la classe PanneauConfig, envoie les requêtes à la base et affiche le résultat dans la zone de texte "resultat".

import java.awt.Frame;
import java.awt.Button;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.sql.*;
class Appli extends Frame 
{
  PanneauPhrase select, from, where, group, order;
  TextArea resultat;
  Button send;
  PanneauConfig pc;
  public Appli ()
    {
	super("e-motion - Connection à la BDD Freez");
      setLayout (new GridLayout (8, 1));
      add (pc = new PanneauConfig ());
	  add (select = new PanneauPhrase ("SELECT"));
	  add (from = new PanneauPhrase ("FROM"));
	  add (where = new PanneauPhrase ("WHERE"));
	  add (group = new PanneauPhrase ("GROUP BY"));
	  add (order = new PanneauPhrase ("ORDER BY"));
      add (resultat = new TextArea (3,25));
      add (send = new Button ("Envoi"));
      send.addActionListener (new ActionListener (){
	public void actionPerformed(ActionEvent e){
	  envoiRequete ();}});
      addWindowListener (new WindowAdapter ()
			 {public void windowClosing(WindowEvent e)
			   {
			     setVisible (false);
			     dispose ();
			     System.exit (0);
			   }});
      pack ();
      setVisible (true);
    }
  void envoiRequete()
  {
    try
      {
	String nomDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
	try
		{
		Class.forName(nomDriver); 
		}
	catch(ClassNotFoundException cnfe)
		{
		System.out.println("La classe "+nomDriver+" n'a pas été trouvée");
		cnfe.printStackTrace();
		}
	Connection db;
	ResultSet rs;
	Statement s;
	String requete;
	
	  {
	    ResultSetMetaData rsmd;
	    int nCol;
	    db = DriverManager.getConnection(pc.getURL (), pc.getUser (), pc.getPasswd ());
	    s = db.createStatement ();
      /* -----------------------------------------
	 Ici on utilise la méthode getPhrase de nos objets
	 pour constituer une requete a la place de la requete 
	 suivante :
	 ----------------------------------------- */
		requete = select.getPhrase()+from.getPhrase()+where.getPhrase()+group.getPhrase()+order.getPhrase()+";";
	    System.out.println(requete);
	    rs = s.executeQuery (requete);
	    rsmd = rs.getMetaData ();
	    nCol  = rsmd.getColumnCount();
	    resultat.setText ("");
	    while (rs.next ())
	      {
		String tmp= "";
		for (int i = 1; i <= nCol ; ++i)
		  {
		    switch (rsmd.getColumnType (i))
		      {
		      case Types.INTEGER:
			tmp = ""+rs.getInt (i);
			break;
		      case Types.CHAR:
			tmp = ""+rs.getString (i);
			break;
		      default:
			System.out.println("Type non implémenté");
			break;
		      }
		    resultat.append (tmp+"\t");
		  }
		resultat.append ("\n");
	      }
	    db.close ();
	  }
      }
    catch (SQLException ex) 
      {
	System.out.println("Exception: " + ex.toString());
	ex.printStackTrace() ;
      }
  } /* envoiRequete */
  public static void main(String argv[])
    {
      new Appli ();
    }
}



PanneauPhrase

Cette classe récupère le contenu des champs textes select, from, where ... pour retourner une requête toute faite.

import java.awt.Panel;
import java.awt.TextArea;
import java.awt.Label;

class PanneauPhrase extends Panel
{
  private TextArea phrase;
  private String req, espace=" ";
  public PanneauPhrase (String Nom)
    {
      req = Nom;
      add (new Label (Nom));
      add (phrase = new TextArea (2, 30));
    }
  String getPhrase()
    {
      String tmp = phrase.getText ();
      if (tmp.equals(""))
	return tmp;
      else
	return espace+req+espace+tmp;
    } /* getPhrase */
}



PanneauConfig

Cette classe contient l'interface (des champs textes affichant les paramètres de connexion), et retourne l'utilisateur, le mot de passe et l'URL de la base de données utilisés par la méthode
DriverManager.getConnection()
de la classe Appli.

import java.awt.Panel;
import java.awt.TextField;
import java.awt.GridLayout;

class PanneauConfig extends Panel
{
  private TextField tf, base, user, mdp;
  
  public PanneauConfig ()
  {
    Panel tmp;
    setLayout (new GridLayout (2, 1));
    // Cette boite contient l'URL de la base
    tmp = new Panel ();
    tmp.add (tf = new TextField ("jdbc:odbc://localhost:5000", 20));
    tmp.add (base =  new TextField ("/freez"));
    add (tmp);
    // Celle ci contient le nom de l'utilisateur
    tmp = new Panel ();
    tmp.add (user = new TextField ("hote"));
    // et son mot de passe.
    tmp.add (mdp = new TextField (""));
    add (tmp);
  }
  /** Retoune l'URL de la base */
  public String getURL ()
  {
    System.out.println("URL "+tf.getText ()+base.getText ());
    return tf.getText ()+base.getText ();
  }

  /** Retoune le nom de l'utilistateur de la base */
  public String getUser ()
  {
    return user.getText ();
  }

  /** Retoune le mot de passe de l'utilistateur de la base */
  public String getPasswd ()
  {
    return mdp.getText ();
  }
}



Diagnostique

La compilation du code s'effectue normalement.
L'exécution de la classe Appli s'effectue normalement.
Lorsque j'essaye d'envoyer une requête en remplissant le champ select avec * et le champ from avec utilisateurs (cela correspond à afficher toutes les entrées de la table utilisateurs de la BDD freez), j'ai les messages d'erreurs en console suivants :

URL jdbc:odbc://localhost:5000/freez
Exception: java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] Sour
ce de donnÚes introuvable et nom de pilote non spÚcifiÚ
java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] Source de donnÚ
es introuvable et nom de pilote non spÚcifiÚ
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
        at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
        at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
        at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
        at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at Appli.envoiRequete(Appli.java:65)
        at Appli$1.actionPerformed(Appli.java:32)
        at java.awt.Button.processActionEvent(Unknown Source)
        at java.awt.Button.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)


NB : Ce code est tiré d'un programme qui à l'origine marchait sur une base de donnée postgreSQL mais située en local sur le serveur de l'IUT. Seuls le chargement du driver, et les paramètres de connexion diffères!
Mais il faut prendre en compte le fait que j'utilise un tunnel SSH pour tester ce client (PuTTY est lancé).

Si vous lisez ces lignes, je vous remercie déjà d'avoir lu ce petit roman, et je vous remercie d'avance pour toute piste que vous pourriez me donner! Merci.
Configuration: Windows Vista
Firefox 2.0.0.12
Répondre à onigami  Signaler ce message aux modérateurs
Connexion à une bdd via JDBC (Résolu) Bonjour, je cherche à me connecter à un bdd oracle via JDBC et en utilisant netbeans est ce que c'est possible? merci www.commentcamarche.net/forum/affich-5160134-connexion-a-une-bdd-via-jdbc
Passer d'une connexion via ethernet à WiFi (Résolu) Bonjour, J'ai une livebox et lorsque je l'ai installée, je l'ai installée avec une connexion via ethernet. Ensuite j'ai installé une clé WiFi et j'ai voulu me connecter en WiFi mais cela ne marche pas. Alors je suis allé sur... www.commentcamarche.net/forum/affich-6665156-passer-d-une-connexion-via-ethernet-a-wifi
Hebergement sans BDD (mysql) (Résolu) Bonjour Je voudrai savoir si il est possible d'avoir une base mysql sur un serveur qui a la base ne propose pas se service! Mon FAI me propose un compte de 100mo php sans BDD mysql et la c trés embetant pour installer nuked klan par exemple. Donc... www.commentcamarche.net/forum/affich-1128215-hebergement-sans-bdd-mysql
Connexion via clé usb xifi de chez Free. (Résolu)Bonjour, Voici mon mathos: - Asus eee pc 1000 h ayant carte Xifi intégrée, - PC de bureau ancien et connecté via la clé USB Wifi vendue par Free, - et Freebox HD. Pas de problème pour le portable; pour la tour connexion excellente tant que je ne... www.commentcamarche.net/forum/affich-9436820-connexion-via-cle-usb-xifi-de-chez-free
Problème de droits d'une applet java (Résolu)Bonjour, voilà deux jour que je recherche une solution a mon problème via google mais rien. J'en viens donc au forum. je développe une application java qui fonctionne très bien avec des requètes mysql (via jdbc) donc pas de soucis de ce côté. les... www.commentcamarche.net/forum/affich-4183586-probleme-de-droits-d-une-applet-java
[Debian] Problème Mysql (Résolu)Bonjour a vous, je vien comme un c.. de changer tous mes mots de passe de" ma bdd mysql4.1 via phpmyadmin et plus aucune connection ne marche que ce soit par phpmyadmin ou par la console de débian, que faire ?? desinstaller mysql?? si oui je vien de... www.commentcamarche.net/forum/affich-3641679-debian-probleme-mysql
Télécharger Casc'ADSLCasc'ADSL est un outil destiné aux Internautes se connectant via le service d'accès distant et désireux de maintenir leur connexion active. Hormis cette fonctionnalité, cet outil intègre plusieurs fonctionnalités intéressantes comme des statistiques... www.commentcamarche.net/telecharger/telecharger-34055061-casc-adsl
Télécharger Driver scanner HP Scanjet 2400Le scanner ScanJet 2400 de Hewlett Packard est un scanner à plat de bureau pour PC. Il se connecte via la connexion USB. Il propose une résolution optique de 2400 ppp x 2400 ppp. Son élément de numérisation est du type CDD. Ce modèle gère : les films... www.commentcamarche.net/telecharger/telecharger-34056945-driver-scanner-hp-scanjet-2400
Télécharger Driver scanner CanoScan N670ULe scanner CanoScan N670U de Canon est un scanner à plat de bureau. Il est compatible avec les systèmes PC et MAC. Il se connecte via la connexion USB. Il propose une résolution optique de 1200 dpi. et maximum de 1200 x 600 dpi. Il intègre un bouton... www.commentcamarche.net/telecharger/telecharger-34056941-driver-scanner-canoscan-n670u
Nokia E50E 50, Autonomie en conversation : 6.4h, autonomie en veille : 215 h, Appareil photo : Oui, Integré, 105 grammes, WAP, GPRS, MP3, Java, Connexion USB, Modem, Jeux:Pro Tour Golf, Lecteur MP3 ou Audio, Mémoire interne:70.0 MB, Résolution:1280x960... www.commentcamarche.net/guide-achat/nokia-e50-644360-fiche-technique
LG KE800KE 800, Autonomie en conversation : 3h, autonomie en veille : 200 h, Appareil photo : Oui, Integré, WAP, MP3, Type de batterie:Li-Ion, Temps de veille:200 heures, HSCSD, WAP, Indice D.A.S:0.0 W/kg, EDGE, Bluetooth, Radio, Java, Connexion USB, Jeux:Pump it www.commentcamarche.net/guide-achat/lg-ke800-866151-fiche-technique
LG KF300KF 300, Autonomie en conversation : 2h, autonomie en veille : 200 h, Appareil photo : Oui, Integré, 97 grammes, WAP, GPRS, MP3, MMS, WAP version/sécurité:2.0, WAP, EDGE, Bluetooth, Java, Connexion USB, Radio, Lecteur MP3 ou Audio, Mémo vocal, Indice D.A.S www.commentcamarche.net/guide-achat/lg-kf300-1150457-fiche-technique
Les types de pilotes JDBCLes types de pilotes JDBC Les pilotes JDBC actuels sont classés en quatre catégories : Pilotes de type 1: Pilotes accèdant à une base de données par l'intermédiaire d'une autre technologie (on parle de passerelle). Les passerelles JDBC-ODBC,... www.commentcamarche.net/contents/jdbc/jdbcpilotes.php3