web-dev-qa-db-fra.com

La connexion à SQL Server fonctionne parfois

Une application ADO.Net ne peut parfois que se connecter à un autre serveur du réseau local. Il semble aléatoire qu'une tentative de connexion réussisse ou échoue. La connexion utilise une chaîne de connexion sous la forme:

Serveur = THESERVER\TheInstance; Base de données = TheDatabase; ID utilisateur = TheUser; Mot de passe = ThePassword;

l'erreur renvoyée est:

Délai de connexion expiré. Le délai d'attente s'est écoulé lors de la tentative d'utilisation de l'accusé de réception de connexion préalable à la connexion.
Cela peut être dû à l'échec de l'établissement de la connexion préalable à la connexion ou à l'incapacité du serveur à répondre à temps.
La durée passée lors de la tentative de connexion à ce serveur était - initialisation [Pré-connexion] = 42030; poignée de main = 0; 

L'application .NET est une petite application de test qui exécute le code suivant:

using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
    conn.Open();
    int rowCount = (int)cmd.ExecuteScalar();
}

TheTable est petit, juste 78 lignes.

Cependant, sur la même machine où l'application .NET reçoit cette erreur, je peux me connecter à THESERVER à l'aide de SSMS et du nom d'utilisateur/mot de passe nommé dans la chaîne de connexion.

Pourquoi la connexion peut-elle échouer à partir d'une application ADO.Net, mais réussir avec des informations d'identification identiques à partir de SSMS?

83
Eric J.

Il s'est avéré que TCP/IP était activé pour l'adresse IPv4, mais pas pour l'adresse IPv6, de THESERVER.

Apparemment, certaines tentatives de connexion ont fini par utiliser IPv4 et d'autres par IPv6.

L'activation de TCP/IP pour les deux versions IP a résolu le problème.

Le fait que SSMS a fonctionné s'est avéré être une coïncidence (les premières tentatives ont probablement utilisé IPv4). Certaines tentatives ultérieures de connexion via SSMS ont généré le même message d'erreur.

Pour activer TCP/IP pour des adresses IP supplémentaires:

  • Démarrer SQL Server Configuration Manager
  • Ouvrez le nœud Configuration réseau SQL Server
  • Cliquez sur Protocoles pour MYSQLINSTANCE
  • Dans le volet de droite, cliquez avec le bouton droit sur TCP/IP.
  • Cliquez sur Propriétés
  • Sélectionnez l'onglet Adresses IP
  • Pour chaque adresse IP répertoriée, assurez-vous que Actif et Activé sont tous deux Oui.
84
Eric J.

J'ai eu la même erreur vient de se produire, ce qui correspond étrangement à la dernière série de mises à jour de Microsoft (09/02/2016). J'ai constaté que SSMS était connecté sans problème alors que mon application ASP.NET renvoyait le "délai d'attente écoulé lors de la tentative d'utilisation de l'accusé de réception de connexion préalable à la connexion".

La solution pour moi a été d’ajouter un délai de connexion de 30 secondes dans la chaîne de connexion, par exemple:

ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"

Dans ma situation, la seule connexion affectée était celle qui utilisait la sécurité intégrée et je personnifiais un utilisateur avant la connexion. Les autres connexions au même serveur utilisant l'authentification SQL fonctionnaient parfaitement!

Deux systèmes de test (clients distincts et serveurs SQL) ont été affectés en même temps, ce qui m'a amené à suspecter une mise à jour Microsoft!

25
Shaun Keon

J'ai résolu le problème comme Eric, mais avec quelques autres changements:

  • Démarrer SQL Server Configuration Manager
  • Ouvrez le nœud Configuration réseau SQL Server
  • Cliquez sur Protocoles pour MYSQLINSTANCE
  • Dans le volet de droite, cliquez avec le bouton droit sur TCP/IP.
  • Cliquez sur Propriétés
  • Sélectionnez l'onglet Adresses IP
  • Pour chaque adresse IP répertoriée, assurez-vous que Actif et Activé sont tous deux Oui.

ET 

  • Pour chaque adresse IP répertoriée, assurez-vous que TCP Dynamic Ports est vide et que TCP Port = 1433 (ou un autre port).
  • Ouvrez le pare-feu Windows et vérifiez que le port est ouvert dans les connexions entrantes.
15
Renzo Ciot

J'ai eu le même problème en essayant de me connecter à Visual Studio à un serveur d'un réseau local (via un réseau privé virtuel) tout en configurant un modèle de données Entity.
Géré à résoudre uniquement en définissant TransparentNetworkIPResolution=false dans la chaîne de connexion. Dans l’assistant VS Add Connection, vous pouvez le trouver dans l’onglet Avancé.

6
maozx

J'ai eu le même problème de prise de contact lors de la connexion à un serveur hébergé.

J'ai ouvert mon centre de réseau et de partage et activé IPv6 sur ma connexion réseau sans fil.

enter image description here

5
Pomster

Mon exécutable créé à l'aide de .NET Framework 3.5 a commencé à signaler ces problèmes de connexion environ la moitié des fois après l'installation récente de certaines mises à jour Windows (semaine du 7 août 2017).

Les échecs de connexion étaient dus à .NET Framework 4.7 installé sur l'ordinateur cible (l'installation automatique des mises à jour Windows était activée) - https://support.Microsoft.com/?kbid=3186539

La désinstallation de .NET Framework 4.7 a résolu les problèmes de connexion.

Apparemment, il y a un changement radical dans .Net Framework 4.6.1 - TransparentNetworkIPResolution La mise à jour de la chaîne de connexion conformément à l'article a également résolu le problème sans qu'il soit nécessaire de restaurer la version de l'infrastructure.

3
user270576

J'ai corrigé cette erreur sur Windows Server 2012 et SQL Server 2012 en activant IPv6 et en débloquant le port entrant 1433.

2
smwikipedia

J'ai eu le même problème, parviens à le résoudre par ouverture/activation le port 1433 et TCP/IP dans le Gestionnaire de configuration SQL Server, puis Redémarré le serveur

 enter image description here

1
Myk Agustin

Dans mon cas, toutes les options étaient déjà présentes.

Résolu en augmentant le délai de connexion = 30.  SQL Server management Studio

1
Jignesh

Dans notre cas, un problème est survenu en raison de la configuration du cluster de disponibilité. Pour résoudre ce problème, nous avons dû définir MultiSubnetFailover sur True dans la chaîne de connexion.

Plus de détails sur MSDN

0
Uriil

Pour moi, il s’avère que le pare-feu de Windows Server bloquait le port 1433, qui est le port du serveur SQL par défaut. Donc, ajouter une règle entrante pour accepter ces connexions a été la solution.

0

Avant de perdre plus de temps à résoudre le problème, essayez comme moi de redémarrer votre ordinateur Windows. Travaillé pour moi après avoir appliqué toutes les autres solutions.

0
chainstair

Résolu ce problème en bloquant/liste noire les adresses IP qui essayaient de forcer brutalement les comptes d'utilisateurs. Vérifiez dans vos journaux d'accès SQL un grand nombre de tentatives de connexion infructueuses (généralement pour le compte "sa"). 

0
user3424480

J'ai eu ce problème lorsque j'ai effectué une migration de SharePoint 2010 à 2013. Je le soupçonnais parce que le serveur de base de données est de l’autre côté d’un pare-feu qui n’achemine pas IP6, alors qu’il essayait d’utiliser IP6 et échouait lors de la connexion à la base de données.

Je pense que le problème est maintenant résolu. Les erreurs semblent avoir cessé. Ce que j'ai fait, c’est que j’ai simplement désactivé IP6 (en le décochant) pour la carte réseau sur les serveurs SharePoint.

0

J'ai eu le même problème, mais je me connectais à une base de données distante en utilisant une adresse IP statique. Donc, aucune des solutions ci-dessus n'a résolu mon problème. 

J'avais omis d'ajouter le mappage utilisateur approprié pour le login de sécurité que j'utilisais. La solution pour moi consistait simplement à vérifier que le paramètre Mappage utilisateur était configuré pour accéder à ma base de données.

0
John Livermore

Commencez par essayer un simple redémarrage de SQL Server avant de prendre des mesures radicales. Pourrait le réparer. Ça l'a fait pour moi

0
Robert Benyi

Dans mon cas, le paramètre Persist Security Info=true avec l'utilisateur et le mot de passe dans la chaîne de connexion est à l'origine du problème. Supprimez le paramètre ou définissez-le sur false pour résoudre le problème.

0
Ricardo Fontana

L'erreur "Délai de connexion expiré" se produit généralement dans les cas suivants

  • Une instance du moteur de base de données SQL Server n'est pas en cours d'exécution.
  • Le service SQL Server Browser n'est pas en cours d'exécution.
  • Le TCP/IP est désactivé.
  • Le nom du serveur n'a pas été saisi correctement.
  • Il y a des problèmes de réseau.
  • Le port TCP/IP de l'instance du moteur de base de données est bloqué par un pare-feu.
  • Le client et le serveur ne sont pas configurés pour utiliser le même protocole réseau.

Pour vérifier comment suivre cette erreur en fonction des raisons ci-dessus, vérifiez Délai de connexion expiré. Le délai d'attente s'est écoulé lors de la tentative d'utilisation de l'accusé de réception de connexion préalable à la connexion

0