#c# #sql #class #login #datatable
#c# #sql #класс #аутентификация #datatable
Вопрос:
Пытаюсь создать функцию входа в систему. Я создал класс, который будет обладать функциональностью для заполнения datatable из sql-запроса, но он не работает. Нет ошибок, просто нет вставки данных.
Вот мой класс функции входа в систему:
namespace GymCalculator
{
public class LoginFunction
{
public DataTable Login (string username, string pword)
{
using (SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConnectionHelper.CnnVal("GymDB"))) {
string query = ("Select * from [USER] where username = '{username}' and password = '{pword}'");
SqlDataAdapter sda = new SqlDataAdapter(query, connection);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
return dtbl;
}
}
}
}
Вот мой код для вызова класса и функции:
public partial class Login : Form
{
public Login()
{
InitializeComponent();
}
private void Loginbtn_Click(object sender, EventArgs e)
{
var LoginFunction = new LoginFunction();
var DataTable = new DataTable();
DataTable = LoginFunction.Login(Usernametxt.Text, Passwordtxt.Text);
if (DataTable.Rows.Count == 1) {
CalculatorMain calculatorMain = new CalculatorMain();
this.Hide();
calculatorMain.Show();
} else {
MessageBox.Show("You entered the wrong username or password");
}
}
}
Комментарии:
1. строковый запрос = («Select * // Это должно быть: строковый запрос = ($»Select * // Указанный $ ‘интерполяция строк’ // learn.microsoft.com/en-us/dotnet/csharp/language-reference /…
2. Это правильно! Что означает $?
3. ** отредактированный ответ со ссылкой на Microsoft для полного объяснения. **
4. Похоже, вы пытаетесь использовать интерполяцию строк, чтобы вставить текст имени пользователя и пароля непосредственно в sql-запрос. Хотя комментарий @Epistaxis устранит проблему со вставкой строк, я настоятельно рекомендую использовать параметры запроса для предотвращения внедрения sql.
5. Не знал об ограничении на редактирование комментариев в течение 5 минут… Нет необходимости использовать хранимую процедуру для параметризации запроса. Используя объект SqlCommand, который выглядит так, как будто он скрыт в ConnectionHelper, вы могли бы сделать что-то вроде
cmd.Parameters.AddWithValue("@username", username); cmd.Parameters.AddWithValue("@password", pword);
, и запрос изменился бы наSelect * from [USER] where username = @username and password = @password
Ответ №1:
Вот мой окончательный рабочий код… В итоге я использовал хранимую процедуру.
{
public class LoginFunction
{
public DataTable Login (string username, string pword)
{
using (SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConnectionHelper.CnnVal("GymDB")))
{
SqlCommand cmd = new SqlCommand("LoginUser", connection)
{
CommandType = CommandType.StoredProcedure
};
cmd.Parameters.AddWithValue("@USERNAME", username);
cmd.Parameters.AddWithValue("@PASSWORD", pword);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
return dtbl;
}
}
}
Комментарии:
1. Надеюсь, это в образовательных целях. Пароли не должны быть обычным текстом. Это не просто небезопасно для вашего приложения, это подвергает риску ваших пользователей в целом, потому что люди, как правило, используют одни и те же пароли в нескольких системах.
2. Просто тренируюсь 🙂