2009-06-05 5 views
1

Est-il possible de détecter une erreur dans une connexion avant d'obtenir une application "Erreur de niveau de transport" en utilisant Linq? Disons que j'ai un serveur SQL appelé SQLServer1, et que j'exécute une application qui se connecte à ce serveur en utilisant LinQ pour obtenir des informations.Détection d'une erreur de connexion de base de données à l'aide de Linq?

Je décide de changer le nom du serveur en SQLServer2. La prochaine fois que ma course d'application je vais obtenir une erreur comme ceci:

"Une erreur au niveau du transport a eu lieu lors de la réception des résultats du serveur (fournisseur: fournisseur TCP, erreur:. 0 - Le nom de réseau spécifié est n'est plus disponible.) "

Parce que LinQ ne sait pas qu'il y avait un changement!

Comment puis-je l'attraper pendant l'exécution? Est-il possible d'étendre la classe DataContext pour vérifier la connexion avant d'obtenir les données?

Merci!

+0

Je suppose que cela est LinqToSQL et non en fait Linq. –

Répondre

0
try 
{ 
    // run linq query here 
} 
catch (Exception e) 
{ 
    // take appropriate action to handle the error like updating the connection string, etc. 
} 
+0

Merci pour votre réponse. Mais pour être plus précis, je cherche un moyen de faire cette validation en étendant la classe DataContext. Comment cela peut-il être fait? Y a-t-il un moyen pour moi de manipuler la connexion Pool et de découvrir que ma connexion n'est pas OK? Merci encore. –

+0

Vous pouvez peut-être utiliser la propriété DbConnection. Si vous vouliez juste faire une vérification rapide, vous pourriez fermer et ré-ouvrir le DbConnection à l'intérieur d'un bloc try-catch, puis s'il y avait une erreur, vous pourriez définir la chaîne de connexion sur DbConnection à une nouvelle valeur et essayer de l'ouvrir encore. – jjxtra

2

Voici comment j'ai étendu la classe. J'utilise un modèle singleton pour appeler le contexte de données, ce qui entraîne l'instanciation d'un objet de contexte de données par requête de page, quel que soit le nombre de fois que le singleton est appelé. Sur le premier appel au singleton par requête, j'exécute DataContext.DatabaseExists(), et si elle est fausse, je gère gracieusement l'erreur. Maintenant, chaque fois que mon code tente de faire quelque chose avec le datacontext, il invite mes utilisateurs avec un message "Désolé, la base de données est en panne".

ASP.NET C# code:

namespace dal 
{ 
    public partial class DataModelDataContext 
    { 
     public static DataModelDataContext DataContext 
     { 
       get 
       { 
        if (System.Web.HttpContext.Current.Items["ModelDataContext"] == null) 
        { 
         DataModelDataContext datacontext = new DataModelDataContext(); 
         //Once per page request, of the datacontext is requested, check to see if the database connection is valid. 
         if (!datacontext.DatabaseExists()) 
         { 
          System.Web.HttpContext.Current.Response.Redirect("DatabaseIsDown.html"); 
         } 
         System.Web.HttpContext.Current.Items["ModelDataContext"] = datacontext; 

        } 
        return (DataModelDataContext)System.Web.HttpContext.Current.Items["ModelDataContext"]; 
       } 
     } 
    } 
} 
Questions connexes