2010-08-09 3 views
1

Vous vous demandez si je vais dans ce sens. Je crée une application C# qui charge quelques variables de mon fichier App.Config.xml. Je les charge dans une classe "config" (Config.cs) avec d'autres variables que je charge à partir d'une base de données MySQL. C'est ce que ma classe ressemble à ce jour:Enregistrement des valeurs de configuration

class Config 
    { 
     public static string ServerHostname = ConfigurationManager.AppSettings["ServerHostname"]; 
     public static string SoftwareVersion = "v0.1a"; 
     public static int StationID = DBConnector.GetStationID(); 
     public static string StationDescription = DBConnector.GetStationDescription(); 
     public static string StationName = ConfigurationManager.AppSettings["StationName"]; 
    } 

J'utilise Config.StationName pour tirer le Config.StationID et Config.StationDescription à partir d'une base de données MySQL comme ceci dans DBConnector.cs:

public static int GetStationID() 
    { 
     try 
     { 
      MySqlConnection conn = new MySqlConnection(connStr); 
      conn.Open(); 
      string sql = "select station_id from station_master where station_name = @station_name limit 1"; 
      MySqlCommand cmd = new MySqlCommand(sql, conn); 
      cmd.Parameters.AddWithValue("@station_name", Config.StationName); 
      object result = cmd.ExecuteScalar(); 
      conn.Close(); 
      return Convert.ToInt32(result); 
     } 
     catch (Exception ex) 
     { 
      ErrorConnection += ex.ToString(); 
      return 0; 
     } 
    } 
    public static string GetStationDescription() 
    { 
     try 
     { 
      MySqlConnection conn = new MySqlConnection(connStr); 
      conn.Open(); 
      string sql = "select station_description from station_master where station_id = '" + Config.StationID +"' limit 1"; 
      MySqlCommand cmd = new MySqlCommand(sql, conn); 
      // cmd.Parameters.AddWithValue("@station_name", Config.StationName.ToString()); 
      object result = cmd.ExecuteScalar(); 
      conn.Close(); 
      MessageBox.Show(sql); 
      return (result.ToString()); 
     } 
     catch (Exception ex) 
     { 
      ErrorGenericDBException += ex.ToString(); 
      MessageBox.Show(ErrorGenericDBException); 
      return "Error"; 
     } 
    } 

La classe DBConnector.GetStationID fonctionne correctement. Il renvoie la valeur int de ma station. Mais lorsque j'essaie d'afficher le Config.StationDescription, il lève une exception de System.NullReferenceException: référence d'objet n'est pas définie sur une instance d'un objet à Namespace.DBConnector.GetStationDescription(). J'ai pensé que depuis que j'utilisais une classe statique pour Config.StationName, je n'ai pas besoin de créer une instance pour s'y référer. J'ai besoin d'aide pour comprendre pourquoi il lance une exception.

Répondre

1

Pour moi, il semble que vous pourriez mélanger quelle partie du code a le problème. Puisque vous dites que c'est GetSTationDescription qui jette, je ne sais pas pourquoi vous supposez alors StationName a un problème?

Je jetterai un coup d'oeil à la ligne object result = cmd.ExecuteScalar();, si vous mettez un point d'arrêt sur la ligne après cela, est-ce que le résultat a une valeur?

Un autre problème est que vous êtes en train de fermeture seulement la connexion si une exception est pas jeté, il serait plus sûr d'avoir la conn.Close(); dans une instruction finally (ou utilisez une instruction using de sorte que vous n'avez pas à vous soucier le fermer).

+1

J'ai effectivement découvert quel était le problème ... dans ma classe de configuration, je devais déclarer les paramètres qui venaient de l'App.Config FIRST ... Je viens de déplacer la chaîne statique publique StationName = ConfigurationManager.AppSettings ["StationName "]; en haut de la liste et cela fonctionne très bien maintenant. Mais j'ai commencé à utiliser une déclaration finale pour mes connexions. Merci pour le conseil! – muncherelli

Questions connexes