IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Lecture d'une base Microsoft Access via ODBC


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut Lecture d'une base Microsoft Access via ODBC
    Non, ce sujet n'est pas mal placé. Je suis bien au bon endroit.

    J'expose mon problème, et mes avancées.

    J'ai un PC sous Windows avec ma base que je souhaite lire (oh joie!) sur mon PC Linux, et ce de manière répétitive, donc automatique, sachant que la base Access peut être mofidiée. Là, ça m'a posé quelques soucis, puisque Microsoft a ses propres trucs qui ne sont pas comaptibles et qu'il est très préférable que je n'installe rien sur le PC Windows.

    Bref, je me suis donc tournée vers le système ODBC. Après moultes recherches, j'ai fini par trouver le bon driver pour Linux nommé libmdbodbc.so utilisé par le MDBTools. Donc j'ai vu qu'avec ma base sur mon PC Linux, je pouvais éventuellement la lire.

    Là, je me suis d'abord penchée sur le souci : comment récupérer ma base sans rien installer ? Réponse selon moi : "smbclient". Bon, je sais pas encore comment je vais la lancer, mais j'y arriverai. Donc après l'avoir passé sur PC, j'ai créé un DSN (oh joie ! bis) pour lire ma base, au moins sur OpenOffice (d'ailleurs, ça marche pas très bien, puisque je n'arrive pas à lire les tables, je les vois pas...). Bon, je ne me suis pas découragée, et j'ai regardé avec le MDBTools fourni, ça marche.

    Du coup, j'me dis, j'vais pouvoir essayer de me connecter via un programme (écrit en C). Et là.... plouf, ça marche pas.

    Qui a déjà fait ça ? Est-ce que quelqu'un a déjà utilisé la libraire libsqlod.so pour se connecter à un DSN ? Ou qui connait la librairie libmdbodbc.so et son contenu ????

    Merci par avance pour votre aide qui me sera précieuse
      0  0

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Personne donc pour m'aider ?
      0  0

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    J'ai un peu avancé. Mon DSN marche bien et j'ai réussi à m'y connecter !

    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    /* 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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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
    Error at Line : parse error near exec
    Error Tables -1
    [unixODBC]Couldn't parse SQL
     (1)
    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.
      0  0

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    L'erreur me semble claire ... où est ta requête SQL ?

    SELECT * from nom_table;

    Ton V_OD_hstmt ne devrait-il pas contenir cette query ?

    Pour aller plus loin, je pense qu'il existe un jeu de table système qui permet de lister les tables ( en tout cas sous Oracle, le dictionnaire des données existe bel et bien). A moins qu'il n'existe une instruction SQL spécifique à ACCESS qui te permette de le faire automatiquement.
      0  0

Discussions similaires

  1. [ODBC] Insertion d'un fichier dans une base oracle 8i via ODBC
    Par garfield_fr dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/12/2010, 09h58
  2. Réponses: 4
    Dernier message: 06/12/2008, 11h14
  3. Récuperer les données d'une base de donnée via ODBC dans une variable
    Par arogues dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/04/2008, 15h27
  4. Lecture d'une base Microsoft Access via ODBC
    Par Lucinda dans le forum C
    Réponses: 2
    Dernier message: 09/05/2007, 15h50
  5. Acces à une base de données via ODBC
    Par jyg dans le forum MFC
    Réponses: 4
    Dernier message: 23/03/2005, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo