Lorsque j'ai rencontré cette erreur dans Visual Studio,
«Une erreur liée au réseau ou spécifique à l'instance s'est produite lors de l'établissement d'une connexion à SQL Server. Le serveur est introuvable ou inaccessible. Vérifiez que le nom d'instance est correct et que SQL Server est configuré pour autoriser les connexions à distance. (fournisseur: fournisseur de canaux nommés, erreur: 40 - Impossible d'ouvrir une connexion à SQL Server) »
... c'était lors de l'exécution du code C # suivant, qui tentait d'obtenir mes données SQL Server pour les afficher dans une grille. La rupture s'est produite exactement sur la ligne qui indique connect.Open ():
using (var connect = Connections.mySqlConnection)
{
const string query = "SELECT Name, Birthdate, Narrative FROM Friends";
using (var command = new SqlCommand(query, connect))
{
connect.Open();
using (var dr = command.ExecuteReader())
{
while (dr.Read())
{
// blah
}
}
}
}
C'était inexplicable car la requête SQL était très simple, j'avais la bonne chaîne de connexion et le serveur de base de données était disponible. J'ai décidé d'exécuter manuellement la requête SQL réelle dans SQL Management Studio et elle s'est très bien déroulée et a produit plusieurs enregistrements. Mais une chose ressortait dans les résultats de la requête: il y avait du texte HTML incorrectement encodé dans un champ de type varchar (max) dans la table Friends (en particulier, certains symboles de commentaire encodés du type <!--
hébergé dans les données de la colonne "Narrative"). La ligne de données suspecte ressemblait à ceci:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
Notez le symbole HTML codé " <
", qui représentait un caractère "<". D'une manière ou d'une autre, cela a fait son chemin dans la base de données et mon code C # n'a pas pu le récupérer! Il a échoué à chaque fois directement sur la ligne connect.Open ()! Après avoir modifié manuellement cette ligne de données dans la table de base de données Friends et inséré le caractère "<" décodé à la place, tout a fonctionné! Voici à quoi cette ligne aurait dû ressembler:
Name Birthdate Narrative
==== ========= ==============
Fred 21-Oct-79 <!--HTML Comment -->Once upon a time...
J'ai modifié la mauvaise ligne que j'avais en utilisant cette simple instruction UPDATE ci-dessous. Mais si vous aviez plusieurs lignes offensantes de code HTML codé, vous pourriez avoir besoin d'une instruction UPDATE plus élaborée qui utilise la fonction REPLACE:
UPDATE Friends SET Narrative = '<!--HTML Comment -->Once upon a time...' WHERE Narrative LIKE '<%'
Donc, la morale de l'histoire est (au moins dans mon cas), désinfectez votre contenu HTML avant de le stocker dans la base de données et vous n'obtiendrez pas cette erreur cryptique SQL Server en premier lieu! (Euh, assainir / décoder correctement votre contenu HTML fait l'objet d'une autre discussion digne d'une recherche StackOverflow distincte si vous avez besoin de plus d'informations!)