none
Vieilles applications en C ne se connectent plus aux serveurs SQL depuis leurs installations sur une station Windows 10 RRS feed

  • Question

  • Bonjour à tous,

    Dans l’entreprise pour laquelle je travaille nous utilisons depuis plus de 10 ans une série d’applications en C qui se connectent sur différents serveurs SQL.  Sur chaque nouvel ordinateur (jusqu’à Windows  8) nous installons les outils SQL en provenance de SQL2000.  Sur les nouveaux ordinateurs, en Windows 10, l’installation des outils SQL2000 se butte à un problème de compatibilité. Nous installons donc SQL Server 2014 Management Studio.  Toutes les applications en VB et en VB.NET fonctionnent comme avant.  Nos vieilles applications en C refusent de se connecter et envoie ce message dans une boîte de dialogue:

    Unable to connect: SQL Server is unavailable or does not exits.  Unable to connect: SQL Server does not exist or network access denied

    Certains DLL installés par les outils SQL2000, entre autre ntwdblib.dll, ne le sont plus par Management Studio.  On les a copiés au fur et à mesure qu’un message d’erreur apparaissait pour aboutir finalement au message ci-dessus.  Les applications sont compilées avec une version de Visual C++ datant de leur période de création.  L’une d’entre-elle a fait l’objet de modifications en novembre 2016. 

    La réécriture des programmes n’étant pas une option envisageable qu’avons-nous comme solution?

    1-      1- Nouvelle ligne de connexion

           2- Méthode qui nous permettrait d’installer les outils SQL2000 sur Windows 10

           3- Installer les outils SQL en provenance d’une version plus récente

    Dans un cas comme dans l’autre pouvez-vous me donner des informations.

    Merci


    • Modifié PifoModif vendredi 20 janvier 2017 18:59
    vendredi 20 janvier 2017 18:56

Toutes les réponses

  • Bonjour

    Pouvez vous nous communiquer la chaine de connexion ?

    Si SSMS depuis un poste distant se connecte correctement à la BD, votre appli devrait y arriver. Passer sur du TCP, vérifiez les ports de firewall éventuellement.

    https://conseilit.wordpress.com/2016/06/27/sql-server-troubleshooting-connectivity-diagram/

    Pour les chaines de connexion : https://www.connectionstrings.com/sql-server/

    cdlt

    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    jeudi 2 février 2017 17:33
  • Bonjour Christophe

    Désolé pour le délai, j’étais absent du travail depuis 3 semaines.  

    Certains  éléments ont déjà été vérifiés pendant mon absence: TCP, firewall.  On a même réussi à installer SQL2000 sur un PC en Windows 10.  Dans ce cas la connexion s’établie si on est en SQL authentication mais ne se fait pas si on est en Trusted (ce qui est notre cas).   Pour se connecter aux serveurs  nos programmes C utilisent des fonctions incluses dans ntwdblib.dll  Voici le code de la fonction qui est appelée par nos programmes pour établir la connexion.          

    PDBPROCESS *ConnectProduction(void)
    {
    char szSQLServer[32],szSQLdb[32];                                                       //nom du serveur
    char ligne[128],tmp[32];
    FILE *in;
    PDBPROCESS dbproctmp = (PDBPROCESS)NULL;
    static PLOGINREC LoginRec;
    static char      *entete="Fonction ConnectProduction()";                

     if((in=fopen("\\\\haddock\\applications\\SERVEURS.INI","r"))==NULL)
    {
     MessageBox(NULL,"Fichier T:\\SERVEURS.INI n'est pas accessible.\rAvertir le groupe ISP (4ISP)",entete,0l);
    return ((PDBPROCESS *)NULL);
    }

    szSQLServer[0]='\0';
    szSQLdb[0]='\0';

    while (fgets(ligne,127,in) != NULL)
     {
    if(strstr(ligne,"ISPProduction.Servername") != NULL)
    {
    sscanf(ligne,"%*s%*s%s",tmp);
    strcpy(szSQLServer,&tmp[1])
    szSQLServer[strlen(szSQLServer)-1]='\0';
    }
     if(strstr(ligne,"ISPProduction.Database") != NULL)
    {
    sscanf(ligne,"%*s%*s%s",tmp);
    strcpy(szSQLdb,&tmp[1]);
    szSQLdb[strlen(szSQLdb)-1]='\0';
    }
    }
    fclose(in);

    if(szSQLServer[0]=='\0' || szSQLdb[0]=='\0')
    {
     MessageBox(NULL,"Pas trouvé l'information nécessaire dans T:\\SERVEURS.INI.\rAvertir le groupe ISP (4ISP)",entete,0l);
    return ((PDBPROCESS *)NULL);
    }

    DBLOCKLIB();

    if((LoginRec = dblogin()) != (PLOGINREC)NULL)  // alloue la struc LOGINREC
    {
    #if defined(WIN10)
    {
    DBSETLUSER(LoginRec,"ispuser1_std");           //user name
    }
    #else
    DBSETLSECURE(LoginRec);
    #endif

    DBSETLHOST(LoginRec,Computer);
    DBSETLAPP(LoginRec,"ProductionDLL");

    dbproctmp = dbopen(LoginRec,(LPSTR)szSQLServer); //ouverture de la connection
    if(dbproctmp==(PDBPROCESS)NULL)                        //si NULL, pas de connection
    {
    dbfreelogin(LoginRec);
    DBUNLOCKLIB();//libere la memoire
    return ((PDBPROCESS *)NULL);
    }
    else                                                      //connection etablie
    {
    dbuse(dbproctmp,(LPSTR)szSQLdb);
    dbfreelogin(LoginRec);
    DBUNLOCKLIB();
    return ((PDBPROCESS *)dbproctmp);
    }
    }
    else // memory allocation problem
    {
    MessageBox(NULL, "Problème d'allocation de mémoire",entete, MB_ICONHAND | MB_OK);
    DBUNLOCKLIB();
    return ((PDBPROCESS *)NULL);
    }
     return ((PDBPROCESS *)NULL);

    Si tu as d'autres idées.

    Merci

                                   
    • Modifié PifoModif mardi 28 février 2017 12:28
    mardi 28 février 2017 12:24
  • Bonjour

    L'appli est-elle 32b ou 64b ?

    Pour tester les drivers OLDB, créez un fichier test.udl sur le bureau et remplissez les paramètres de connexion pour OLEDB.

    Testez la connexion mode SQL et Sécurité intégrée.

    Faites de même avec un provider ODBS en 32b et 64b, sécurité SQL et intégrée.

    Faites une matrice de ce qui fonctionne et ce qui ne fonctionne pas.

    Si tous ces tests sont OK, cela vient de votre code / libraire d'accès SQL.

    cdlt


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    mardi 28 février 2017 15:53
  • Bonjour Christophe

    Après avoir discuté avec le responsable SQL du groupe TI de l’entreprise, on en est venu à la conclusion qu’il serait préférable de créer un nouveau DLL pour établir la connexion.  Cette option nous mettrait à l’abri de problèmes similaires lors des prochaines relâches, soit du OS, soit de SQL.

    Merci pour le temps et les différentes suggestions.

    mardi 7 mars 2017 15:45