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

Développement SQL Server Discussion :

Erreur sur l'instruction SQLConnect


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut Erreur sur l'instruction SQLConnect
    Bonjour,

    J'ai développé une application en langage C sous windows.
    Cette appli insère des données dans une table d'une base de données Windows ms sql server, grâce à la ib ODBC (include sql.h).

    Quand j’exécute mon appli dans windows, aucun pb, tout se passe bien.

    En revanche, quand j’exécute cette même appli via une procédure stockée dans ms sql server 2008, j'ai les messages d'erreur suivant lors de la connexion à la base :

    Erreur sur l'instruction SQLConnect
    SQLSTATE=IM002.

    Ca signifie que la base est introuvable et qu'aucun driver par défaut n'a été spécifié.


    Hors c'est le cas puisque ça marche quand j’exécute mon prog en ligne de commande ms dos ou en double cliquant dessus. De plus, j'ai paramétré mes pilotes comme suit :

    Odbc data source administrator > user dsn > add > etc... > le test est ok

    même chose pour :

    Odbc data source administrator > system dsn > add > etc... > le test est ok


    Je ne comprend pas pourquoi la connexion à la base échoue.
    Si quelqu'un a une idée et peut m'aider, je lui en serais reconnaissant.

    Merci par avance.

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    En revanche, quand j’exécute cette même appli via une procédure stockée dans ms sql server 2008, j'ai les messages d'erreur suivant lors de la connexion à la base :
    C'est à dire ? Comment tu l'exécutes ton programme depuis une procédure stockée ? Avec xp_cmdshell ? Tu peux nous en dire plus à ce sujet ?

    ++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Je lance sous windows Miscrosoft sql Server management studio, puis je lance ce code :


    DECLARE @Commande varchar(2048)

    SET @Commande = 'D:\Mon_repertoire\mon_appli.exe'
    EXEC master..xp_cmdshell @Commande
    voici le résultat :


    SQLSTATE=IM002.
    MESSAGE_TEXT=.
    ERREUR!!! sql() : Erreur sur l'instruction SQLConnect
    ERREUR!!! sql() : Erreur sur l'instruction SQLExecDirect
    ERREUR!!! : Echec sql() : Erreur sur l'instruction SQLExecDirect
    Les messages d'erreur correspondent aux sprintf(stderr... de mon application en C (et non des erreur sql).

    Merci.

    le code développé dans l'appli est le code préconisé par ODBC, et il marche très bien car j'arrive à insérrer des données dans ma table quand j'execute mon programme via dos.

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Quelle est ta méthode d'authentification dans ton programme ? Connexion avec des logins Windows ou via un login purement SQL ?

    ++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Je ne sais pas trop, je fais comme ça, je pense que mon pb vient de là effectivement. Sans doute un parramètre à modifier dans la fonction SQLConnect. Le user /password est celui de ma base de données, mais ça bloque avant le test sur le user password. Merci pour ton aide mikedavem.



    int sql()
    {
    bool err = 0;

    int i = 0, n;

    ...

    char fic_rpt[MS_MAX], l[MS_MAX2];
    char ... horodatage[MS_MAX + 1];
    ...
    char requete[1024+1];
    char Serveur[MS_MAX+1]="Mon_Serveur";
    char Login[MAIN_LEN+1]="MonLogin";
    char Pwd[MAIN_LEN+1]="MonPass";

    FILE *fch;

    time_t temps;
    struct tm date;

    SQLRETURN retcode;


    ...

    // Connexion à la base de données
    retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    retcode=SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);

    if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    retcode=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    else
    {
    fprintf(stderr, "ERREUR!!! sql() : Erreur sur l'instruction SQLAllocHandle\n");
    sprintf(g_mess_err, "Erreur sur l'instruction SQLAllocHandle");
    err = 1;
    }

    // Vérification du Lien ODBC, Login Et Pwd
    if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    retcode=SQLConnect(hdbc, (SQLCHAR*)Serveur, SQL_NTS, (SQLCHAR*)Login, SQL_NTS, (SQLCHAR*)Pwd, SQL_NTS);
    else{
    fprintf(stderr, "ERREUR!!! sql() : Erreur sur l'instruction SQLSetEnvAttr\n");
    sprintf(g_mess_err, "Erreur sur l'instruction SQLSetEnvAttr");
    err = 1;}

    if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    else{
    SQLCHAR sqlstate[5+1];
    SQLCHAR sqlmessage[SQL_MAX_MESSAGE_LENGTH+1];
    SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,sqlstate,NULL,sqlmessage,NULL,NULL);
    printf("SQLSTATE=%s.\n",sqlstate);
    printf("MESSAGE_TEXT=%s.\n",sqlmessage);
    fprintf(stderr, "ERREUR!!! sql() : Erreur sur l'instruction SQLConnect\n");
    sprintf(g_mess_err, "Erreur sur l'instruction SQLConnect");
    err = 1;
    }

    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Ouverture du fichier */
    sprintf(fic_rpt, "%s...
    if (!(fch = fopen(fic_rpt, "r")))
    {
    fprintf(stderr, "ERREUR!!! : Pb ouverture fichier %s\n",
    fic_rpt);
    sprintf(g_mess_err, "Pb ouverture fichier %s", fic_rpt);
    fclose(fch); err = 1;
    }

    /* récupération et insertion en base */
    while (fgets(l, MS_MAX2, fch))
    {
    if (i == 0) {i++; continue;} /* entete */
    ...

    if(sscanf(l, "%d ; %s ; %s ; %s ; %ld ; %ld ; %ld ; %d ; %d ; %d%n",
    ...
    &n) != 10)
    {
    fprintf(stderr, "ERREUR!!! : pb formatage de %s :\n",
    fic_rpt);
    fprintf(stderr, "%s\n", l);
    sprintf(g_mess_err, "pb formatage de %s (%s)", fic_rpt, l);
    fclose(fch); err = 1; continue;
    }

    // Execution de la requete (insertion en base de la ligne...)
    sprintf(requete, "insert into [Mon_Serveur].[dbo].[MaTable] VALUES ('%s',%s,'%d','%s','%s','%s','%ld','%ld','%ld','%d','%d','%d')",
    ...);

    if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    retcode=SQLExecDirect(hstmt, (SQLCHAR*)requete, SQL_NTS);
    else{
    if (i == 1) fprintf(stderr, "ERREUR!!! sql() : Erreur sur l'instruction SQLAllocHandle\n");
    else fprintf(stderr, "ERREUR!!! sql() : Erreur sur l'instruction SQLExecDirect\n");
    sprintf(g_mess_err, "Erreur sur l'instruction SQLExecDirect ou SQLAllocHandle");
    err = 1; break;}
    i++;
    }
    fclose(fch);
    }
    else{
    fprintf(stderr, "ERREUR!!! sql() : Erreur sur l'instruction SQLExecDirect\n");
    sprintf(g_mess_err, "Erreur sur l'instruction SQLExecDirect");
    err = 1;}

    // Déconnexion
    SQLFreeStmt(hstmt, SQL_DROP);
    SQLDisconnect(hdbc);
    SQLFreeConnect(hdbc);

    if (err) return -1;

    return 0;
    }


  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Au niveau du pilote j'ai testé les 2 configurations :
    1) With windows NT authentification
    2) With sql Server authentification

    Aucun des 2 ne marche.

Discussions similaires

  1. Pb Erreur sur l' instruction Find
    Par Aladin_23 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/11/2010, 12h41
  2. Erreur sur instruction if
    Par Snooky68 dans le forum Django
    Réponses: 14
    Dernier message: 15/01/2010, 12h52
  3. [VB2005]Erreur sur instruction CreateObject
    Par Herlece dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/08/2008, 13h53
  4. erreur sur l'instruction move
    Par Namson dans le forum VB.NET
    Réponses: 12
    Dernier message: 19/05/2007, 23h52
  5. [MySQL] Erreur sur une instruction UPDATE
    Par Sir Tengu dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/12/2006, 13h59

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