В DataTable не вставляются строки

#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. Просто тренируюсь 🙂