Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007
-
24 avril 2007 à 11:09
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007
-
22 mai 2007 à 15:55
Bonjour,
Je vous expose mon problème. J'ai deux PC : un Linux et un Windows. Sur le PC windows, j'ai une base Access que je souhaite exploiter. Ne pouvant rien installer sur ce PC (du moins c'est très préférable) je me suis intéressée à une connexion ODBC. J'ai donc téléchargé pour mon PC Linux la librairie adaptée (libsqlod.so) et j'ai écrit un ch'tit bout de programme (trouvé sur le net) qui est censé juste se connecter à la base de données.
Sauf que... c'est pour une connexion à une base de données sur le même PC visiblement.
Alors ma question c'est : auriez-vous une idée de ce que je pourrais utiliser comme fonction de cette librairie pour réussir à me connecter à ma base Access qui est sur l'autre PC (puisque mon programme en C est sur le PC Linux) ?
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007 22 mai 2007 à 15:55
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é !
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007 25 avril 2007 à 11:51
Bon, j'ai un peu avancé depuis hier, et je vois que personne ne sait me répondre visiblement ....
J'aimerai pourtant bien y arriver.
J'ai trouvé sous Linux la même interface que sous Windows (panneau de configuration > outils d'administration > sources de données) pour pouvoir créer un DSN (youpi !). Sauf que ... forcément, j'arrive pas à la configurer. On me dit de partout de modifier le fichier odbc.ini mais les seuls exemples sont jamais avec une base en réseau...
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 26 avril 2007 à 19:58
Salut,
Sous Windows, pour
accéder à une base de données Access en réseau, il suffit de partager le
dossier contenant cette base. Le chemin à spécifier pour y accéder
contient donc le nom du serveur suivi de celui du dossier avec le nom
du fichier mdb. Je n'ai jamais essayé avec Linux mais il est probable
que ça fonctionne.
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007 27 avril 2007 à 09:32
Non ce n'est pas aussi simple pour Linux.
J'ai trouvé le bon driver ODBC pour accéder à une base Access sous Linux (ce ne fut pas facile : j'ai pris la librairie libmdbodbc.so dans le MDBTools de Linux). J'ai donc bien pu voir que si ma base était sur mon PC, j'arrive à voir les tables, et donc par extension, je suppose pouvoir m'en servir.
Par contre, en réseau, je n'arrive toujours pas à configurer mon DSN de telle manière à la lire. Solution éventuelle : la rappatrier systématiquement avant mon traitement (qui doit être automatique). Par contre, je n'ai aucune idée des fonctions utilisables sous C pour me connecter via un programme à cette base et y faire mes requêtes.
Et la commande "smbclient" ne marche pas chez moi. Il me met l'erreur : "NT_ACCESS_DENIED" alors qu'il accepte bien la connexion anonyme... Et puis je ne sais pas trop comment la lancer en automatique... p't-être un shell qui ferait la commande et lancerai mon programme C...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007 27 avril 2007 à 17:10
Bon alors j'ai réussi à faire marcher la commande "smbclient" (youpi !)
Par contre, connexion au DSN que j'ai configuré (et qui est viable, puisque testé)... que dalle ! J'comprends pas. J'ai pourtant prix un code sur le net, j'l'ai recoupé avec un autre... Que t'chi !
Est-ce qu'il y aurait parmi vous des gens qui utilisent en C les fonctions des fichiers en-tête sql.h, sqlext.h et sqltypes.h de la librairie libsqlod.so ???
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007 7 mai 2007 à 14:29
J'ai avancé... alors je vais vous montrer ce que j'ai fait, peut-être aurais-je plus de chance : (je reprends depuis le début, pour être plsu claire)
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
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 ?
emmatopiak
Messages postés149Date d'inscriptionmercredi 28 mars 2007StatutMembreDernière intervention17 mai 20072 7 mai 2007 à 14:45
Salut,
Mouais le seul truc que je peux dire c'est que ça me paraît louche ça
"The listener supports no services"
Est-ce que c'est normal selon toi d'avoir ce message ?
Lucinda000
Messages postés27Date d'inscriptionmardi 24 avril 2007StatutMembreDernière intervention21 juin 2007 7 mai 2007 à 14:52
Ben non justement, c'est bien ce que je dis "Et là, je vois aucun service quand je lance la commande "lsnrctl start"."
Je ne comprends pas pourquoi il ne voit aucun service alors que j'ai configuré mes fichiers... Je les ai modifié, en espérant que ça corrige quelque chose, mais non.
Je donne malgré tout ma modification (au cas où ça puisse aider) :
Fichier "listener.ora"
Tout le problème vient de la partie en gras, parce que j'ai cet écran-là quand je lance mon programme :
AllocHandle.........OK
SetEnv..............OK
AllocHDB............OK
...........Listing DSN
Server=(SAMPLE) Driver Used=(MicrosoftAccess)
Server=(DSN) Driver Used=(MicrosoftAccess)
........End of Listing
Connection..........OK
AllocStmt...........OK
[B]Error at Line : parse error near exec
Error Tables -1
[unixODBC]Couldn't parse SQL
(1)/B
On remarque que tout va bien jusqu'à l'appel à "SQLTables"... Mais pourquoi ?
Je sais que personne n'a répondu, mais j'aimerai vraiment y arriver, alors je relance le sujet, dans un élan de désespoir.