1

Bonjour !

Je cherche désespérément à me connecter à une base de données PostgreSQL (8.2) via un programme C++ codé sous Visual C++ 6.
J'ai trouvé le code que je joins, mais ça ne fonctionne pas : déjà j'ai du transtyper les chaînes de caractères pour que ça compile (genre char* en const char*, mais ça c'est pas trop grave...).

Le problème c'est qu'à l'exécution il me dit qu'il ne trouve pas le driver... sad Pourtant dans le panneau de config, ma connexion ODBC est validé (un clic sur le bouton "test" me dit que la connexion ODBC est valide)

Est ce que vous avez une idée de l'origine du problème ??

ma chaîne de connexion n'est certainement pas valide, mais pourtant elle me semble bonne :
#define CONNSTR "DSN=nomDeMaConnexion;DRIVER={PostgreSQL ANSI}"



//issu de http://www.softlookup.com/tutorial/vc++/vcu33fi.asp

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <string.h>
#define CONNSTR \
        "DBQ=AGES.XLS;DRIVER={Microsoft Excel Driver (*.xls)}"
#define CONNLEN (sizeof(CONNSTR)-1)
#define SQLTRY(x,y) \
        { \
          rc = y; \
          if (rc != SQL_SUCCESS) \
          { \
            char buf[255]; \
            char szState[6]; \
            char szMsg[255]; \
            SDWORD sdwNative; \
            SWORD swMsgLen; \
            SQLError(hEnv, hDBC, hStmt, szState, &sdwNative, \
                     szMsg, sizeof(szMsg), &swMsgLen); \
            wsprintf(buf, "Error %d performing %s\nSQLState = %s" \
                    "\nSQL message = %s", rc, x, szState, szMsg); \
            MessageBox(NULL, buf, "Error", MB_OK | MB_ICONSTOP); \
            goto Terminate; \
          } \
        }
int WINAPI WinMain(HINSTANCE d1, HINSTANCE d2, LPSTR d3, int d4)
{
    SQLHENV hEnv = 0;
    SQLHDBC hDBC = 0;
    SQLHSTMT hStmt = 0;
    SQLCHAR szConnStr[255];
    SQLCHAR szStmt[255];
    SQLCHAR szFirstName[255];
    SQLCHAR szLastName[255];
    long nAge;
    SWORD cbConnStr;
    RETCODE rc;
    SDWORD sdwLNLen;
    SDWORD sdwFNLen;
    SDWORD sdwALen;
    int i;
    char szResult[1000];
    SQLTRY("SQLAllocEnv", SQLAllocEnv(&hEnv))
    SQLTRY("SQLAllocConnect", SQLAllocConnect(hEnv, &hDBC))
    SQLTRY("SQLDriverConnect", SQLDriverConnect(hDBC, NULL,
                                   CONNSTR, CONNLEN, szConnStr,
                                   sizeof(szConnStr), &cbConnStr,
                                   SQL_DRIVER_NOPROMPT))
    SQLTRY("SQLAllocStmt", SQLAllocStmt(hDBC, &hStmt))
    wsprintf(szStmt, "SELECT * FROM [Sheet1$]");
    SQLTRY("SQLPrepare", SQLPrepare(hStmt, szStmt, strlen(szStmt)))
    SQLTRY("SQLBindCol", SQLBindCol(hStmt, 1, SQL_C_CHAR,
                 (PTR)szLastName, sizeof(szLastName), &sdwLNLen))
    SQLTRY("SQLBindCol", SQLBindCol(hStmt, 2, SQL_C_CHAR,
                 (PTR)szFirstName, sizeof(szFirstName), &sdwFNLen))
    SQLTRY("SQLBindCol", SQLBindCol(hStmt, 3, SQL_C_SLONG,
                 (PTR)&nAge, sizeof(nAge), &sdwALen))
    SQLTRY("SQLExecute", SQLExecute(hStmt))
    for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
    {
        wsprintf(szResult, "Record #%d\nLast Name: %s\nFirst Name:"
                 " %s\nAge: %d", i, szLastName, szFirstName, nAge);
        MessageBox(NULL, szResult, "Data", MB_OK);
    }
    if (rc != SQL_NO_DATA_FOUND)
    {
        SQLTRY("SQLFetch", rc)
    }
    MessageBox(NULL, "Successfully completed.", "Success", MB_OK);
Terminate:
    if (hStmt) SQLFreeStmt(hStmt, SQL_CLOSE);
    if (hDBC) SQLDisconnect(hDBC);
    if (hDBC) SQLFreeConnect(hDBC);
    if (hEnv) SQLFreeEnv(hEnv);
}

2

As tu trouvé une solution à ton problème ?
J'ai besoin moi aussi de jouer avec postgres 8.3 depuis une application en console que je dois nécessairement developper sous vc6.
je ne parviens pas à utiliser libpqxx...

Cdlt,

Séb

3

Bonjour !

Alors, oui, je m'en étais sorti en codant un wrapper C++ au dessus d'une bibliothèque C puisque libpqxx n'a jamais voulu "compiler/fonctionner/je ne sais plus" sous VC6. De mémoire, il était écrit explicitement dans la doc qu'en dessous de VC7 ce n'était pas la peine d'essayer...
Bref, mon wrapper proposait une API plus ou moins équivalente à JDBC, mais je n'avais pas tout implémenté... (pas le temps)

Je ne sais pas si j'ai toujours les sources, mais je devrais au minimum pouvoir te donner le nom de la bibliothèque C avec laquelle ça fonctionnait smile

N'hésite pas à m'envoyer un mini message si jamais j'oublie tongue