Auteur de questions
Vieilles applications en C ne se connectent plus aux serveurs SQL depuis leurs installations sur une station Windows 10

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
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
-
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
-
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
-
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.