Voici une classe permettant la connexion à une base Access 2010 (sans mot de passe) pour récupérer une table souhaitée dans un Vector de Vector d' Object.
Attention :
- Le programme doit être compiler en 32 bit car le driver ODBC pour Access 2010 n'existe que en 32 bit !
- Vous devez avoir installer le driver ODBC (recherchez "Moteur de base de données Microsoft Access 2010 redistribuable" sur internet)
Ceci est mon premier post de code, n'hésitez pas à me donner votre avis dessus...
Source / Exemple :
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import java.util.Vector;
public class AccessTable{
private Vector<Vector<Object>> vvs_table = new Vector<Vector<Object>>(); // Tableau contenant la Table après un getTableInVector()
private String path; // Chemin vers ma table Access (ne pas oublier les double back-slash "\\" ex: C:\\repertoire\\matable.accdb)
private String table; // Nom de la Table
private Connection conn;
private Statement st;
private boolean etap1 = false;
private boolean etap2 = false;
private boolean etap3 = false;
/* Ces booleans me servent à vérifier que l'objet AccessTable est correctement utilisé
- pour ne pas lancer une connexion sans avoir donner un chemin d'accès et une table
- ou pour ne pas déconnecté si l'on ne sait pas connecté d'abord...
- /
public AccessTable() throws SQLException
{
}
public AccessTable(String pathtodb)
{
this.path = pathtodb;
this.etap1 = true;
}
public AccessTable(String pathtodb, String tablename)
{
this.path = pathtodb;
this.table = tablename;
this.etap1 = true;
this.etap2 = true;
}
public void setPathToDataBase(String s) throws Throwable
{
if(!this.etap3)
{
this.path = s;
this.etap1 = true;
}
else
{
throw new Exception("AccessTable en cours d'utilisation");
}
}
public void setTableName(String s) throws Throwable
{
if(!this.etap3)
{
this.table = s;
this.etap2 = true;
}
else
{
throw new Exception("AccessTable en cours d'utilisation");
}
}
public void connection() throws Throwable //Initialise la connexion
{
if( this.etap1 && this.etap2)
{
this.conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+this.path);
this.st = this.conn.createStatement();
this.etap3 = true;
}
else
{
throw new Exception("AccessTable non configuré !");
}
}
public Vector<Vector<Object>> getTableInVector() throws Throwable // Récupération de la Table dans un Vector de Vector d'objet
{
if (this.etap3)
{
ResultSet rs = this.st.executeQuery("SELECT * FROM "+this.table);
for(int i = 0; rs.next();i++)
{
Vector<Object> vs = new Vector<Object>();
for (int j = 1 ; j<= rs.getMetaData().getColumnCount();j++)
{
vs.add(rs.getObject(j));
}
this.vvs_table.add(vs);
}
}
else
{
throw new Exception("AccessTable non connecté");
}
return this.vvs_table;
}
public void disconnection() throws Throwable // déconnexion
{
if (this.etap3)
{
this.st.close();
this.conn.close();
this.etap3 = false;
}
else
{
throw new Exception("AccessTable non connecté");
}
}
public static void main(String[] arg0) throws Throwable
{
Scanner sc = new Scanner(System.in);
System.out.println("Chemin vers la DataBase ? (ex : C:\\\\directory\\\\myDataBase.accdb)");
String p = sc.next();
System.out.println("Nom de la table ?");
String t = sc.next();
AccessTable at = new AccessTable();
at.setPathToDataBase(p);
at.setTableName(t);
at.connection();
Vector<Vector<Object>> vvo_test = at.getTableInVector();
at.disconnection();
for(Vector<Object> vo : vvo_test)
{
System.out.println(vo.toString());
}
}
}
16 juin 2011 à 12:16
- Au sujet des normes d'écriture Java
-- On ne met pas de _ dans les variables comme pour vvo_test qu'on nommerait plutôt vvoTest.
-- On nomme les méthode par des noms d'action donc disconnection ne va pas, on choisira plutot disconnect (deconnecter plutôt que deconnexion)
-- Les // servent a bloquer du code pour qu'il ne s'execute pas, si tu as des remarques à faire dans ton code, utilise /* */ et pour la javadoc /** */
-- les { s'ouvrent sur la ligne courante et se ferment sur une nouvelle ligne donc tu écris :
if(test==1){
//Code
}
Essaye de te créer une classe d'exception exprès. Il est préférable de propager un seul type d'exception pour qu'on sache ce qu'on attrape, donc tu peux catcher les SQLException et lever une exception personnalisée avec un message d'erreur dédié, ajoute bien l'exception dans le constructeur pour que tu gardes la trace (en faisant new ExceptionPerso("message", exceptionCatchee)).
Évite les throws Throable ou Exception.
16 juin 2011 à 12:04
16 juin 2011 à 10:48
http://www.javafr.com/codes/ACCES-BASE-ORACLE_53290.aspx
15 juin 2011 à 09:28
15 juin 2011 à 09:11
Les mauvaises idées sont :
- Tu ne respectes pas les normes d'écriture en Java ;
- Stocker le résultat dans un tableau d'objet obligera à faire des cast ;
- Lever des exceptions de type Exception : tu aurais pu créer tes propres classes d'exceptions et des messages d'erreurs particuliers à chaque erreur ;
- Les throws Throwable systématiques t'empêchent d'attraper les exceptions liées à la base de donnes
- L'idée des trois booléens est bizarre, si tu gérais mieux les exceptions, tu t'en sortirais sans, et en plus, leurs noms ne sont pas explicites, tu aurais pu les appeler setPathOk, connexionOk... par exemple
Je ne te donne pas de note, si tu as des questions sur mes remarques, tu peux les poser,
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.