Хранение значений конфигурации - PullRequest
1 голос
/ 09 августа 2010

Интересно, правильно ли я пойду? Я создаю приложение C #, которое загружает несколько переменных из моего файла App.Config.xml. Я загружаю их в класс «config» (Config.cs) вместе с другими переменными, которые я загружаю из базы данных MySQL. Вот так выглядит мой класс:

 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"];
    }

Я использую Config.StationName для извлечения Config.StationID и Config.StationDescription из базы данных MySQL, например, в 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";
        }
    }

Класс DBConnector.GetStationID работает нормально. Возвращает значение int моей станции. Но когда я пытаюсь отобразить Config.StationDescription, он генерирует исключение System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта в Namespace.DBConnector.GetStationDescription ().

Я подумал, что, поскольку я использовал статический класс для Config.StationName, мне не нужно создавать экземпляр для ссылки на него. Мне нужна помощь, чтобы понять, почему это исключение.

1 Ответ

1 голос
/ 09 августа 2010

Мне кажется, что вы, возможно, путаете, какая часть кода имеет проблему.Поскольку вы говорите, что выбрасывает GetSTationDescription, я не уверен, почему вы предполагаете, что StationName имеет проблему?

Я бы взглянул на строку object result = cmd.ExecuteScalar();, если выпоставить точку останова на строку после этого, имеет ли результат значение?

Другая проблема заключается в том, что вы в настоящее время закрываете соединение, только если исключение не выдается, было бы безопаснее иметь conn.Close();внутри оператора finally (или используйте оператор using, чтобы вам не пришлось беспокоиться о его закрытии).

...