Connexion réseau à une base Access [Résolu]

Signaler
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007
-
Lucinda000
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007
-
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) ?

Merci par avance.

12 réponses

Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

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/
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

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...

Quelqu'un aurait-il la solution ?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
11
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.
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

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...
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

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 ???
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

Mais euh, personne ne peut m'aider ?
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

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

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 !
Messages postés
149
Date d'inscription
mercredi 28 mars 2007
Statut
Membre
Dernière intervention
17 mai 2007
1
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 ?

Une autruche ne se cuit pas aux petits lardons.
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

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"

SID_LIST_LISTENER=
   (SID_LIST=
       (SID_DESC=
      (PROGRAM=hsodbc)
      (SID_NAME= hsdsn )              
      (ORACLE_HOME =/home/oracle/product/9.2.0)
    )
   )

Fichier "tnsnames.ora"

hsdsn  =
  (DESCRIPTION=
    (ADDRESS=
        (PROTOCOL=tcp)
    (HOST=localhost)
    (PORT=1521)
    )
    (CONNECT_DATA=
        ( SID=hsdsn )
    )
    (HS =OK)
  )

... Peut-être que ça vient de mon DSN, ou d'un mauvais driver ODBC...
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

Quelques p'tites nouvelles.

Alors en fait, j'ai le bon driver et j'ai bien configuré mon DSN, parce que j'arrive à me connecter à ma base grâce à un p'tit programme en C

Par contre, j'arrive pas à faire de requête....

Alors est-ce que quelqu'un à une idée ??? Quelqu'un connait la librairie "libodbc.so" ?
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

Re...
Ca marche toujours pour la connexion au DSN.
Mais... j'arrive pas à voir les tables d'une base de données (toute bête pourtant).

Alors est-ce que quelqu'un pourrait m'aider ? Voici mon code :

/* odbc.c

    testing unixODBC
*/
#include <stdlib.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>

SQLHENV             V_OD_Env;     // Handle ODBC environment
long             V_OD_erg;     // result of functions
SQLHDBC             V_OD_hdbc;    // Handle connection

char             V_OD_stat[10]; // Status SQL
SQLINTEGER         V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT         V_OD_mlen;
char             V_OD_msg[200],V_OD_buffer[200];

// Variable for queries
SQLHSTMT V_OD_hstmt;    // Handle for a statement
static SQLINTEGER         error;

void OD_ListDSN(void)
{
 char       l_dsn[100],l_desc[100];
 short int  l_len1,l_len2,l_next;

 // Add cvc
 printf("...........Listing DSN\n");

 l_next= SQL_FETCH_FIRST;
 while( SQLDataSources(V_OD_Env,l_next,l_dsn, sizeof(l_dsn),
        &l_len1, l_desc, sizeof(l_desc), &l_len2) == SQL_SUCCESS)
     {
      printf("Server=(%s) Driver Used=(%s)\n",l_dsn,l_desc);
      l_next=SQL_FETCH_NEXT;
     }
 // Add cvc
 printf("........End of Listing\n");
}

int main()
{
    // 1. allocate Environment handle and register version
    V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
        printf("Error AllocHandle\n");
        exit(0);
    }
    else printf("AllocHandle.........OK\n");
    V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION,
                               (void*)SQL_OV_ODBC3, 0);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
        printf("Error SetEnv\n");
        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
        exit(0);
    }
    else printf("SetEnv..............OK\n");
    
    // 2. allocate connection handle, set timeout
    V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
        printf("Error AllocHDB %d\n",V_OD_erg);
        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
        exit(0);
    }
    else printf("AllocHDB............OK\n");
    SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT,
    (SQLPOINTER *)5, 0);
    
    // List the DSNs
    OD_ListDSN();
    
    // 3. Connect to the datasource "DSN"
    V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "SAMPLE", SQL_NTS,
                                     (SQLCHAR*) "", SQL_NTS,
                                     (SQLCHAR*) "", SQL_NTS);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
        printf("Error SQLConnect %d\n",V_OD_erg);
        SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1,
                      V_OD_stat, &V_OD_err,V_OD_msg,100,&V_OD_mlen);
        printf("%s (%d)\n",V_OD_msg,V_OD_err);
        SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
        exit(0);
    }
    printf("Connection..........OK\n");
    
    // 4. Test of one querie
    V_OD_erg = SQLAllocHandle(SQL_HANDLE_STMT,V_OD_hdbc,&V_OD_hstmt);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
        printf("Error SQLBind First Column %d\n",V_OD_erg);
        SQLDisconnect(V_OD_hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
        exit(0);
    }
    else printf("AllocStmt...........OK\n");
    

    // Liste... test
     V_OD_erg = SQLTables(V_OD_hstmt,NULL,0,NULL,0,NULL,0,NULL,0);
    if ((V_OD_erg ! = SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
        printf("Error Tables %d\n",V_OD_erg);
        SQLGetDiagRec(SQL_HANDLE_STMT, V_OD_hstmt,1,
                      V_OD_stat, &V_OD_err,V_OD_msg,100,&V_OD_mlen);
        printf("%s (%d)\n",V_OD_msg,V_OD_err);
        SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
        SQLDisconnect(V_OD_hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
        exit(0);
    }
    SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
    SQLDisconnect(V_OD_hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
    
}

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.
Messages postés
27
Date d'inscription
mardi 24 avril 2007
Statut
Membre
Dernière intervention
21 juin 2007

Ne vous en faites surtout pas pour moi, j'ai bien avancé, je vois mes tables...

Même si bon... j'me demande bien pourquoi ce sujet a été tellement regardé vu le nombre de réponses que j'ai eu.

Pour ceux qui se demandent, je mets juste 2-3 indices : libraire "libmdbodbc", <mdbtools.h>,<mdbsql.h> et voilà.

Après, j'arrive pas encore à faire des requêtes sur ma base, mais ça doit bien être possible.