locked
Problème procedure stocké avec odbc32.lib RRS feed

  • Question

  • Bonjour,

    J'ai créé une dll en c++ qui en utilisant la librairie Microsoft odbc32.lib me permet d'effectuer des traitements SQL. Ma base de donnée est SQLServer 2000.
    Je n'est aucun problème avec des requêtes SQL mais qu'en je lance certaines procédures stockés je me retrouve avec une erreur "[Microsoft][ODBC SQL Server Driver]État de curseur non valide" lors de l'exécution de "SQLColAttribute " et/ou aucunes lignes de retournées.
    Plus particulièrement ces problèmes apparaissent quand dans ma procédure stockée j'ai des déclarations de variables et/ou des requêtes non retournées (donc pour quasiment toutes^^).
    Voici un extrait de mon code :

         // Handles ODBC
        SQLHENV     henv = NULL;
        SQLHDBC     hdbc = NULL;
        SQLHSTMT    hstmt = NULL;

        char szData[100];
        short l;
        //Vous devez adapter ce qui suit à votre DSN spécifique
        PTSTR       szDataSource = "furio";
        PTSTR       szUID = "actulog";
        PTSTR       szPWD = "sigboxfurio";

        SQLTCHAR* szSQLSelect = (SQLTCHAR*) "execute getArticle '12267/1'";

        // Initialise l'environnement ODBC.
        if (SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv) == SQL_ERROR)
        {
            cout<<"Erreur Initialisation de l'environnement ODBC"<<endl;
            goto EXIT;
        }

        SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, SQL_IS_INTEGER);

        // Alloue un handle de connexion et se connecte à la source de données.
        if (SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc) == SQL_ERROR)
        {
            cout<<"Erreur Allouage Handle de Connexion"<<endl;
            goto EXIT;
        }

        if (SQLConnect(hdbc, (SQLTCHAR*) szDataSource, SQL_NTS, (SQLTCHAR*) szUID,
        SQL_NTS, (SQLTCHAR*) szPWD, SQL_NTS) == SQL_ERROR)
        {
            cout<<"Erreur Connexion"<<endl;
            goto EXIT;
        }

        // Récupère un handle d'instruction et exécute une instruction Transact-SQL SELECT.
        if (SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt) == SQL_ERROR)
        {
            cout<<"Erreur Allouage Handle d'Instruction"<<endl;
            goto EXIT;
        }

        if(SQLPrepare(hstmt, szSQLSelect, SQL_NTS) == SQL_ERROR)
        {
            cout<<"Erreur Préparation du Statement"<<endl;
            goto EXIT;
        }

        if (SQLExecute(hstmt) == SQL_ERROR)
        {
            cout<<"Erreur Execution du Statement"<<endl;
            goto EXIT;
        }

        if (SQLColAttribute(hstmt, NULL, SQL_DESC_COUNT, NULL, 1, NULL, buf3) == SQL_ERROR)
        {
            cout<<"Erreur dans SQLColAttribute"<<endl;
            goto EXIT;
        }

        if (SQLFetchScroll(hstmt, SQL_FETCH_NEXT, NULL)== SQL_ERROR)
        {
            cout<<"Prochain Enregistrement Innexistant"<<endl;
            goto EXIT;
        }

    EXIT:
        if (hstmt != NULL)
            {
            SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
            }
        if (hdbc != NULL)
            {
            SQLDisconnect(hdbc);
            SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        if (henv != NULL)
            {
            SQLFreeHandle(SQL_HANDLE_ENV, henv);
            }
        return (0);
    }


    En vous remerciant d'avance pour votre aide
    lundi 24 novembre 2008 15:20

Réponses

Toutes les réponses

  • Etes-vous dans ce cas de figure ?

    http://support.microsoft.com/kb/831997/en-us

    lundi 24 novembre 2008 16:37
  • Oui ça ressemble à mon problème.
    Après vérification mon serveur sql est bien en sp3, mais j'ai une version personnel et je n'arrive pas à installer le sp4, soit j'obtiens une erreur au lancement si je prend le sp4 pour version MSDE, soit l'installation se fait mais ma version ne change pas si je prend un autre type de sp4.
    La version personnel est une version gratuite mais est elle considéré comme une version MSDE ?

    En tout cas merci pour le tuyau je continu mes recherches dans cette voie.
    mardi 25 novembre 2008 08:40
  • Bon bilan impossible d'installer le sp4 sur n'importe quelle version de SQL Server et sur trois machines différentes dont une virtuelle. Je crois que je vais passer un petit coup de fil à Microsoft en espérant qu'ils seront capable d'installer leur propre mise à jours...
    Quelqun à déja réussi à installer un sp4 sur SQLSERVER 2000 ?!?
    mercredi 26 novembre 2008 08:37
  • J'ai l'impression que je touche deux problèmes différents. Ma procédure stocké fonctionne très bien si je la lance à partir d'Excel et vers le même serveur SQL (où je n'arrive pas à installer le sp4). J'ai regarder les dépendances d'Excel et il s'avère que se sont les mêmes que pour mon programme (odbc32.dll...).
    Si Excel le fait je doit pouvoir y arriver, enfin je sèche je sais pas comment y font...
    mercredi 26 novembre 2008 09:44