Robert S4r Ответов: 3

Как использовать строку подключения с помощью свойства app config в C#


Это может выглядеть дубликатом, но я использовал поисковую систему в течение нескольких дней только для того, чтобы устранить эту ошибку "ССЫЛКА на объект не установлена на экземпляр объекта".
Когда я запускаю код в режиме отладки, он выполняется, но при развертывании и установке его на той же машине возникает ошибка.

Что я уже пробовал:

// App.config
<connectionStrings>
    <add name=" SSM.Properties.Settings.ScMgP"
      connectionString="server=localhost;user id=root;password=xxxx;database=ssmp;persistsecurityinfo=True;port=3306"
      providerName="MySql.Data.MySqlClient" />
  </connectionStrings>


//form.cs
using System;
using MySql.Data.MySqlClient;
using System.Configuration;

      private void txtP_TextChanged(object sender, EventArgs e)
        {
            connUN.ConnectionString = ConfigurationManager.ConnectionStrings["SSM.Properties.Settings.ScMgP"].ConnectionString;
       try
           {
               MySqlCommand cmd = new MySqlCommand();
               MySqlDataReader ReaderUN;
               connUN.Open();
               cmd.Connection = connUN;
               cmd.CommandText = "Select * from system where password ='" + txtP.Text + "'  ";
               ReaderUN = cmd.ExecuteReader();
               if (ReaderUN.Read())
               {
Department Form = new Department();Form.Show();this.Hide();
}
               connUN.Close();
           }
           catch (Exception ex)
           {
MessageBox.Show("Failed to connect to database... system error Message.   " + ex.Message, "Database connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
            finally{}
        }

MadMyche

Это исключение просто происходит или вы открываете окно сообщения?

Robert S4r

Откроется окно сообщения

3 Ответов

Рейтинг:
2

Richard MacCutchan

Это сообщение просто указывает на то, что вы пытаетесь использовать ссылку на объект, который не был инициализирован. Первое, что вам нужно сделать, это найти строку кода, где это происходит, и диагностировать, почему ссылка равна нулю.

И, как дополнение, не используйте конкатенацию строк ("Select * from system where password ='" + txtP.Text + "' ") в SQL. Используйте правильные параметризованные запросы. И никогда храните пароли в открытом тексте, это оставляет всю вашу систему открытой для хакеров. Используйте соленые и хэшированные значения.


Robert S4r

Он указывает на строку

Коннан.ConnectionString = ConfigurationManager.ConnectionStrings["SSM.Properties.Настройки.ScMgP"].Параметр connectionString;

Рейтинг:
15

F-ES Sitecore

Вы ничего не читаете из файла app.config. Когда вы используете диспетчер конфигураций, он ищет имя конфигурации, соответствующее исполняемому файлу, поэтому, если ваша программа "MyApp.exe-тогда ваш конфигурационный файл должен называться "MyApp.exe.config". App.config-это просто имя-заполнитель, когда вы публикуете свой код VisualStudio копирует содержимое app.config в файл с правильным именем.


Robert S4r

Я переименовал файл app.config в SSM.config. "(от SSM.exe)".
теперь исключение NullReferenceException возникает в строке debug at
var connection = ConfigurationManager.ConnectionStrings[ScMgP].Параметр connectionString;

Линия изменена

F-ES Sitecore

Это должен быть SSM.exe.config

Robert S4r

Решено успешно! Большое спасибо.

Рейтинг:
1

MadMyche

Кое-что я заметил.:

Где Коннан определились?

private void txtP_TextChanged(object sender, EventArgs e)
  {
    connUN.ConnectionString = ConfigurationManager.ConnectionStrings["SSM.Properties.Settings.ScMgP"].ConnectionString;
Почему вы поступили именно так? Вы не думали о том, чтобы попробовать что-то подобное?
private void txtP_TextChanged(object sender, EventArgs e)
  {
    string _cs = ConfigurationManager.ConnectionStrings["SSM.Properties.Settings.ScMgP"].ConnectionString;
    using (SqlConnection connUN = new SqlConnection(_cs)) {


Следующая вещь-это то, как вы строите эту команду. Это просто опасно! НИКОГДА следует ли вам собрать команду SQL из встроенных строк, содержащих пользовательский ввод. Это яркий пример SQL-инъекции, и он уже более 20 лет входит в топ-10 уязвимостей. Правильно было бы использовать Параметры и добавление пользовательского ввода путем добавления значений позже. Вот соответствующий блок построения кода на моем предыдущем примере кода
try {
  SqlCommand cmd = new SqlCommand(_qry, connUN);
  cmd.Parameters.AddWithValue("@password", txtP.Text());


И последнее - это ваша обработка ошибок. Он предполагает, что каждый каждый брошенный находится с базой данных. Есть варианты, и вы можете сложить их в стопку. catch заявления для отображения лучшей информации о вашей ошибке. Единственное правило заключается в том, что родовое поймать (исключение бывший) является последним, так как он поймает любое исключение. Используя определенный улов MySqlException, вы можете получить доступ к свойствам, специфичным для MySql.
catch (MySqlException sx) {
  MessageBox.Show(
    "MySql Exception " + sx.Message
    , "Database error #" + sx.Code
    , MessageBoxButtons.OK
    , MessageBoxIcon.Error
  );
}
catch (Exception ex) {
  MessageBox.Show(
    "System error Message.   " + ex.Message
    , "General Error"
    , MessageBoxButtons.OK
    , MessageBoxIcon.Error
  );
}


Я не могу гарантировать, что это исправит вашу запрошенную проблему, но эти блоки кода безопаснее и могут быть более информативными, когда у вас действительно есть проблема.


Robert S4r

Спасибо за этот дополнительный совет! Очень ценю!