Форма входа, исключение SQL

Я пытаюсь сделать простую программу, которая имеет вход в систему, с локальной базой данных только для тестирования. И я продолжаю получать сообщение об ошибке при попытке открыть соединение с базой данных SQL.

 private void logInButton_Click(object sender, EventArgs e)
    {
        MainMenu openMainMenu = new MainMenu();
        SqlConnection sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C: \Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf;Integrated Security=True;Connect Timeout=30");
        sqlcon.Open();
        SqlCommand cmd = new SqlCommand("Select * from Table Where username ='" + usernameTextBox.Text + "' and password = '" + passwrodTextBox.Text + "'");
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dtbl = new DataTable();
        sda.Fill(dtbl);
        if (dtbl.Rows.Count > 0)
        {
            openMainMenu.Show();
            this.Hide();
        }
        else
            MessageBox.Show("Wrong username or password!");
    }

Я получаю сообщение об ошибке в sqlcon.Open(); и это: "Необработанное исключение типа" System.Data.SqlClient.SqlException "произошло в System.Data.dll

Дополнительная информация: Попытка присоединить базу данных с автоматическим именем для файла C: \Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf. База данных с таким именем существует, или указанный файл не может быть открыт, или он находится на общем ресурсе UNC."

1 ответ

Решение

Ну, лучший совет, который я могу вам дать - это погуглить сообщение об ошибке. Имейте в виду, что если появляется сообщение об ошибке, это означает, что проблема хорошо известна, и поэтому можно с уверенностью сказать, что кто-то столкнулся с ней раньше вас и сумел ее решить. Первые 4 результата этого поиска относятся к stackru, и по крайней мере два из них приняли ответы, поэтому я полагаю, что небольшой повторный поиск спас бы вас надолго.
Это лучший совет, потому что он выходит далеко за рамки вашей текущей проблемы. Я твердо верю, что хорошие навыки поиска - это самый важный и самый мощный инструмент разработчика sotfware. Я могу заверить вас, независимо от того, сколько времени вы разрабатываете программное обеспечение, почти каждое исключение, которое вы получаете, кто-то еще уже решил и опубликовал решение где-то, вам нужно только найти его.

Теперь, что касается самого кода - у вас есть некоторые серьезные проблемы, кроме исключения, о котором вы спрашиваете:

  1. Конкатенация строк в SQL-операторах вместо использования параметров подвергает ваш код атакам SQL-инъекций. Это очень серьезная угроза, которую очень легко устранить.
  2. Использование инстансов классов, которые реализуют интерфейс IDisposable без правильной их утилизации, может привести к утечке памяти. Читайте о using заявить и сделать это привычкой использовать его каждый раз, когда это возможно.
  3. Обработка исключений. В настоящее время, если ваша база данных не может быть достигнута, вы получите исключение и сбой вашей программы. Вы должны использовать try...catch блокировать в любом месте, которое вы не можете контролировать в коде, чтобы позволить вашей программе завершиться изящно. (Никогда не используйте try... catch для вещей, которые вы можете делать в коде, таких как проверка ввода пользователя или проверка деления на ноль - только для вещей, которые находятся под вашим контролем, таких как доступность базы данных.)

Сказав все это, ваш код должен выглядеть примерно так:

private void logInButton_Click(object sender, EventArgs e)
{
    using (var sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|C:\Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf;Integrated Security=True;Connect Timeout=30"))
    {
        sqlcon.Open();
        using (var cmd = new SqlCommand("Select 1 from Table Where username = @userName and password = @password"))
        {
            cmd.Parameters.Add("@userName", SqlDbType.NVarChar).Value = usernameTextBox.Text;
            cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwrodTextBox.Text;
            using (var dtbl = new DataTable())
            {
                using (var sda = new SqlDataAdapter(cmd))
                {
                    sda.Fill(dtbl);
                }

                if (dtbl.Rows.Count > 0)
                {
                    var openMainMenu = new MainMenu();
                    openMainMenu.Show();
                    this.Hide();
                }
            }
            else
            {
                MessageBox.Show("Wrong username or password!");
            }
        }
    }
Другие вопросы по тегам