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 averti
    Inscrit en
    Avril 2007
    Messages
    28
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    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 averti
    Inscrit en
    Avril 2007
    Messages
    28
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    Par d�faut
    Personne donc pour m'aider ?
      0  0

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    28
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 28
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    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�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