Форма входа, исключение 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. Я могу заверить вас, независимо от того, сколько времени вы разрабатываете программное обеспечение, почти каждое исключение, которое вы получаете, кто-то еще уже решил и опубликовал решение где-то, вам нужно только найти его.
Теперь, что касается самого кода - у вас есть некоторые серьезные проблемы, кроме исключения, о котором вы спрашиваете:
- Конкатенация строк в SQL-операторах вместо использования параметров подвергает ваш код атакам SQL-инъекций. Это очень серьезная угроза, которую очень легко устранить.
- Использование инстансов классов, которые реализуют интерфейс IDisposable без правильной их утилизации, может привести к утечке памяти. Читайте о
using
заявить и сделать это привычкой использовать его каждый раз, когда это возможно. - Обработка исключений. В настоящее время, если ваша база данных не может быть достигнута, вы получите исключение и сбой вашей программы. Вы должны использовать
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!");
}
}
}