Lecture d'une base via DSN et ODBC sur Linux [Résolu]

Lucinda000 27 Messages postés mardi 24 avril 2007Date d'inscription 21 juin 2007 Dernière intervention - 7 mai 2007 à 14:33 - Dernière réponse : Lucinda000 27 Messages postés mardi 24 avril 2007Date d'inscription 21 juin 2007 Dernière intervention
- 22 mai 2007 à 15:51
Bonjour à tous,


Je souhaite accéder à une base access sur un PC Linux en Red Hat 3. Sur
ce PC, il y a donc mon fichier *.mdb et Oracle version 9.2.0


Après plusieurs petites recherches, j'ai trouvé le bon driver pour lire mon fichier *.mdb (j'ai choisi libmdbodbc.so).


J'ai ensuite fouillé sur internet pour trouver un peu d'aide.


J'ai bien créé mon DSN, dont voici les détails :


Pour mon fichier odbcinst.ini :
[MicrosoftAccess]

Description    = ODBC for Microsoft Access

Driver        = /usr/lib/libmdbodbc.so

Setup        = /usr/lib/libmdbodbc.so

FileUsage    = 1


et pour mon fichier odbc.ini :
[DSN]

Description        = MicrosoftAccess Base

Driver        = MicrosoftAccess

Database = /home/users/data/mestests/base.mdb

Servername = localhost


Donc bon, j'essaie de voir si mon DSN est bien configuré, OpenOffice.org le voit, j'me dis : "Chouette, ça doit être bon !"


Ben non, c'est pas fini. Parce que je dois aller lire ma base par programmation...


Donc je me dis, essayons les "heterogeneous services" d'Oracle, ça doit être bien tout ça.


Donc je configure mes p'tits fichiers qui vont bien.

Mon fichier "inithsdsn.ora" localisé dans $ORACLE_HOME/admin
HS_FDS_CONNECT_INFO = DSN

HS_FDS_TRACE_LEVEL = 0

HS_DB_NAME = hsdsn

HS_FDS_SHAREABLE_NAME = /usr/lib/libmdbodbc.so


Mon fichier "listener.ora" placé dans $ORACLE_HOME/network/admin
SID_LIST_LISTENER=

   (SID_LIST=

       (SID_DESC=

      (PROGRAM=hsodbc)

      (SID_NAME=DSN)              

      (ORACLE_HOME=/home/oracle/product/9.2.0)

    )

   )


et mon fichier "tnsnames.ora" placé aussi dans $ORACLE_HOME/network/admin
hsdsn  =

  (DESCRIPTION=

    (ADDRESS=

        (PROTOCOL=tcp)

    (HOST=localhost)

    (PORT=1521)

    )

    (CONNECT_DATA=

        (SERVICE_NAME=DSN)

    )

    (HS=OK)

  )


Une fois tout ça effectué, je suis contente normalement. J'me dis, ça devrait marcher...


Bon je mets les droits sur le fichier "listener.log" sinon ça marche pas.


Et là, je vois aucun service quand je lance la commande "lsnrctl start".


Voilà ce que j'obtiens (oh joie!) :
LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 07-MAY-2007 13:54:43

 

Copyright (c) 1991, 2002, Oracle Corporation.  All rights reserved.

 

Starting /home/oracle/product/9.2.0/bin/tnslsnr: please wait...

 

TNSLSNR for Linux: Version 9.2.0.4.0 - Production

System parameter file is /home/oracle/product/9.2.0/network/admin/listener.ora

Log messages written to /home/oracle/product/9.2.0/network/log/listener.log

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))

 

Connecting to (ADDRESS=(PROTOCOL=tcp)(PORT=1521))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 9.2.0.4.0 - Production

Start Date                07-MAY-2007 13:54:43

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  OFF

SNMP                      OFF

Listener Parameter File   /home/oracle/product/9.2.0/network/admin/listener.ora

Listener Log File         /home/oracle/product/9.2.0/network/log/listener.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))

The listener supports no services

The command completed successfully


Bon alors qu'est-ce que j'ai mal fait ? Comment je peux créer le lien
entre ma base de données access base.mdb et ce truc ? Comment je peux
faire des requêtes là-dedans ?


Please, help me !
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Lucinda000 27 Messages postés mardi 24 avril 2007Date d'inscription 21 juin 2007 Dernière intervention - 22 mai 2007 à 15:51
3
Merci
J'ai fini par réussir, sans ODBC ni DSN, je donne donc ma solution (pour ceux que ça intéresse).

Je rappelle le contexte :

J'ai une base Access sur un PC Windows sur lequel je souhaite ne rien
installer ou rajouter. Et je dois exploiter cette base sous un PC Linux
contenant Oracle (9i). Les deux PC sont en réseau.

Solution

Elle ne fut pas simple à trouver. On ne trouve quasiment rien sur le net
de ce genre.

Attention, elle n'est valable qu'avec un Linux RHEL 3 & Access 97. Je
pense qu'elle est portable sur du RHEL 4 (j'en suis sure même) voir un
autre Linux, mais pour Access, mieux vaut rester dans la version 97 ou
2000 (éventuellement 2002), pas au-delà. Cependant, Microsoft Access
permet la possibilité d'enregistrer sa base en une version antérieure,
donc tout va bien.

Prérequis :

- J'ai trouvé sur le net un magnifique outil : MDBTools
(http://sourceforge.net/projects/mdbtools/). J'ai choisi la version
0.5-1 (la version 0.6pre1 fonctionne, mais uniquement à partir de RHEL
4). Cet outil est tout simplement un driver qui lit les bases Access, et
possède quelques commandes simples d'accès. Donc il faut l'installer sur
le PC Linux

- Il faut créer un compte sur le PC Windows spécifique pour la base (à
cause d'une ligne de commande sous Linux) et mettre en partage le
dossier dans lequel il y a la base.

- La base Oracle doit contenir les tables que l'on veut importer
(c'est-à-dire qu'elles doivent déjà être créées)

Choix des noms :

J'appelle ma base base.mdb (pas original, mais compréhensible) qui aura
une table "table". Et disons que j'appelle mon PC "PC" et le domaine de
mon PC windows "domaine". Le compte nécessaire sur le PC Windows :
"compte" avec comme mot de passe "password" (pas très dur à suivre comme
ça) et le dossier partagé "dossier".

Etapes à Suivre :

Donc je fais les choses dans l'ordre suivant:

1) à l'aide de la commande suivante, je copie ma base sur le PC Linux
(dans le répértoire que je choisis)

smbclient //PC/dossier -U domaine\\compte%password -c 'get base.mdb'

2) J'exporte les tables en format csv pour les importer dans Oracle (à
répéter pour chaque table):

echo "select * from table" | mdb-sql -p -d ';' base.mdb | grep -v table
| grep -v "Row retrieved"

Je fais cela car il est nécessaire de n'avoir que les enregistrements
dans le fichier. L'option "-p" sert à enlever la mise en forme du type :

---------

| table |

---------

| plouf |

---------

L'option -d sert à choisir le séparateur.

NB : sur la version 0.6pre1 du MDBTools, les options "-HF" permettent
d'enlever les noms des colonnes et les stats du fichier csv, donc pas
besoin des "grep".

3) J'importe les tables dans Oracle à l'aide de "sqlldr" après avoir
configuré tous les fichiers de control et d'option correctement. (je ne
mets pas la ligne de commande, je n'ai pas encore approfondi la
question, mais il y a de l'aide sur le site d'Oracle). Il y a notamment
selon moi un bon tuto ici : http://www.supinfo-projects.com/fr/2005/sqlldr/
4) Je fais des requêtes dans Oracle :)

Voili voilou, très simple vu comme ça, mais fallait trouver, et c'était
pas gagné !

Attention : Limitation
La version MDBTools 0.5-1 ne lit pas les tables dont leur nom contient
un "_". Pour se faire, il faut installer les rpm du site suivant (à la
place de ceux "officiels") :
http://bryanmills.net/archives/2003/11/microsoft-access-database-using-linux-and-php/

Merci Lucinda000 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Lucinda000
Lucinda000 27 Messages postés mardi 24 avril 2007Date d'inscription 21 juin 2007 Dernière intervention - 9 mai 2007 à 11:14
0
Merci
Bon, j'ai avancé. J'arrive à me connecter à mon DSN via un programme en C, mais pas à effectuer une requête.

Est-ce que quelqu'un aurait une idée ?
Commenter la réponse de Lucinda000

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.