Skip Navigation Links
Accueil
Java Standard EditionExpand Java Standard Edition
Java EE 5Expand Java EE 5
Visual Basic .Net 2005Expand Visual Basic .Net 2005
Visual C++ .Net 2005Expand Visual C++ .Net 2005
Visual C# .Net 2005Expand Visual C# .Net 2005
Cours ASP .Net 2.0Expand Cours ASP .Net 2.0
PostgresqlExpand Postgresql
LinuxExpand Linux
Visual Studio 2008Expand Visual Studio 2008
ASP 3.0 ClassiqueExpand ASP 3.0 Classique
Cours Javascript - DOM - DHTMLExpand Cours Javascript - DOM - DHTML
Cours AjaxExpand Cours Ajax
VBAExpand VBA
AssembleurExpand Assembleur
PerlExpand Perl
MembresExpand Membres
L'auteur du site
Nouveautés sur le site
Contacts
Plan du site
Accueil > Cours ASP .Net 2.0 > II ASP .net et les bdd
____________________________________________________________________________________________________
Connexion

II) ASP .net et les bases de données 

II.1) Essayer plusieurs fois les requêtes, quand perte de connexion( "lost connexion during query" )

   Il peut arriver, lorsque vous faites une requête sql dans asp .net, que vous perdiez la connexion durant la requête. Il se produit alors l'erreur suivante: "lost connexion during query". J'ai rencontré ce problème avec une base MySQL, sur un hébergeur asp .net 2.0 . Mais quand j'exécutais le site en local, l'erreur ne se produisait pas.
Lors d'un appel à la méthode .fill d'un data adapter, par exemple, l'erreur arrivait, et la requête était, bien entendu, interrompue. Cela pouvait arriver aussi lors d'un insert de la méthode ExecuteNonQuery. La seule possibilité de s'en sortir pour l'internaute utilisateur du site, était d'actualiser la page par F5. Il faut remarquer que lorsque cela arrivait, l'erreur ne se reproduisait jamais lors de l'essai suivant. Le site restait donc utilisable, mais son utilisation était assez fastidieuse, et un peu problématique pour le novice.

   Je précise que cela m'est arrivé sur une base MySQL avec une liaison ODBC, et en C#.

   Un moyen pour s'en sortir définitivement et efficacement, est de recommencer( par programme) une deuxième fois la requête, lorsque le problème arrive. Cela se révèle très efficace, et règle complètement le problème. Le délai d'attente pour l'internaute demeure inchangé, par rapport à l'attente normal de la réponse à la requête, il ne s'aperçoit de rien. Et n'oublions pas que le deuxième essai est tenté uniquement en cas d'échec, donc pas systèmatiquement. Voici un exemple de code pour effectuer ceci:

Remarque: on peut modifier facilement la fonction, afin de lui faire effectuer autant de tentatives qu'on le souhaite( 2 essais étaient assez dans mon cas).

/*********************************************************/
/*                                       Méthode daFill( DataAdapter.fill )                    */
/*********************************************************/
// Sans mettre un temps d'attente anormal pour faire le fill.

//Cette méthode sert à faire UNIQUEMENT le data_ad.fill
//Retourne -1 si problème base de données, ou 0 si pas de problème
//Cette valeur sert à pouvoir savoir si le programme appelant doit faire return 


public static int daFill(System.Data.Odbc.OdbcConnection Conn, System.Data.Odbc.OdbcDataAdapter data_ad, System.Data.DataSet data_set,
string table, string texte_aff_open, string texte_aff_fill, System.Web.UI.Page mapage)
{

   int essais = 0;
   Boolean reussi;
   do {
      reussi = true; //on suppose que ca sera bon cette fois-ci
      essais += 1;
      try {
         data_ad.Fill(data_set, table); // 2eme paramètre pas obligé
      } catch (System.Data.Odbc.OdbcException err) {
   //je vérifie pas que c'est bien lost connection
   //car c'est ça tout le temps, et même si pas ça,
   //on fait que réessayer une 2ème fois

         reussi = false; //dès qu'on rentre ici, c'est faux!
         if (essais > 1) //2 échecs : c'est fini
        {
        //je change qd même VarGlob.deuxfois
        //(VarGlob.deux fois est une variable globale( static) d'un module de
        //classe )

            VarGlob.deux_fois = "Pour webmestre: 2 échecs fill";
            mapage.Response.Write(texte_aff_fill);
            mapage.Response.Write("2essais fill effectués. 2 échecs.");
            mapage.Response.Write("Message: " + err.Message);
            Conn.Close();
            return -1; pb bdd
         }
         else //on n'a essayé qu'une fois( un échec) {
            VarGlob.deux_fois = "Fill effectué la 2ème fois";
            Conn.Close(); //je fais qd même Conn.close, malgré lost connection
            //( perdue)

            //Je rouvre la connexion
            try {
               Conn.Open();
            }
            catch ( System.Data.Odbc.OdbcException err2) {
               mapage.Response.Write(texte_aff_open);
               mapage.Response.Write("open pour 2ème essai fill");
               mapage.Response.Write("Message: " + err2.Message);
               return -1; pb bdd
            } //fin try du open no2
            //on a pu rouvrir
         } //fin if essais>1
      }//fin catch du fill no1
  
} while ((essais < 2) && (reussi = = false));
   //essais=1 ou essais=2
   if (essais == 1) {
      VarGlob.deux_fois = "Fill effectué en une fois";
   } //fin du data_ad.fill
   return 0; //pas de pb bdd
} // fin daFill