C # | Использовать параметр в запросе SqlCommand

#c# #sql-server #asp.net-core #parameters #sqlcommand

#c# #sql-сервер #asp.net-ядро #параметры #sqlcommand

Вопрос:

У меня есть это ASP.NET Основной проект и в моем DAL я собираю свои данные из своей базы данных, но я хочу, чтобы пользователь мог вводить символ типа (Karakter — символ на голландском языке), и DAL должен выбрать 2 случайных символа из базы данных с KarakterSoort = «Защитный».

Это мой текущий код в моем DAL:

 public IEnumerable<IKarakter> GetSortedKarakters()
{
    using (SqlConnection connection = GetConnection())
    {
        connection.Open();
        var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = 'Defensive' ORDER BY NEWID();", connection);
        var reader = command.ExecuteReader();
        var sortedKarakters = new List<IKarakter>();

        while (reader.Read())
        {
            var karakter = new KarakterDTO
            {
                KarakterId = (int)reader["KarakterId"],
                KarakterSoort = reader["KarakterSoort"]?.ToString(),
                KarakterNaam = reader["KarakterNaam"]?.ToString()
            };

            sortedKarakters.Add(karakter);
        }

        return sortedKarakters;
    }
}
  

И это то, что, я думаю, должно быть в правильном направлении решения:

 public IEnumerable<IKarakter> GetSortedKarakters(string givenStringFromUser)
{
    using (SqlConnection connection = GetConnection())
    {
        connection.Open();
        var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = givenStringFromUser ORDER BY NEWID();", connection);
        var reader = command.ExecuteReader();
        var sortedKarakters = new List<IKarakter>();

        while (reader.Read())
        {
            var karakter = new KarakterDTO
            {
                KarakterId = (int)reader["KarakterId"],
                KarakterSoort = reader["KarakterSoort"]?.ToString(),
                KarakterNaam = reader["KarakterNaam"]?.ToString()
            };

            sortedKarakters.Add(karakter);
        }

        return sortedKarakters;
    }
}
  

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

Ответ №1:

Вам нужно добавить a SqlParameter и установить его значение:

 public IEnumerable<IKarakter> GetSortedKarakters(string givenStringFromUser)
{
    using (SqlConnection connection = GetConnection())
    {
        var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = @UserInput ORDER BY NEWID();", connection);
        command.Parameters.Add("@UserInput", SqlDbType.VarChar, 100).Value = givenStringFromUser;

        connection.Open();
        var reader = command.ExecuteReader();
        var sortedKarakters = new List<IKarakter>();

        while (reader.Read())
        {
            var karakter = new KarakterDTO
            {
                KarakterId = (int)reader["KarakterId"],
                KarakterSoort = reader["KarakterSoort"]?.ToString(),
                KarakterNaam = reader["KarakterNaam"]?.ToString()
            };

            sortedKarakters.Add(karakter);
        }

        connection.Close();

        return sortedKarakters;
    }
}
  

Ответ №2:

Вы должны предоставить значение вашего фильтра sql-запросу. Кроме того, не помещайте его непосредственно в строку запроса, а используйте SqlCommand параметры. Это избавит вас от нежелательной sql-инъекции.

Что-то вроде этого должно работать:

 public IEnumerable<IKarakter> GetSortedKarakters(string givenStringFromUser)
{
    using (SqlConnection connection = GetConnection())
    {
        connection.Open();
        var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = @filterValue ORDER BY NEWID();", connection);
        command.Parameters.Add("@filterValue", SqlDbType.VarChar).Value = givenStringFromUser;
        
        var reader = command.ExecuteReader();
        var sortedKarakters = new List<IKarakter>();
        while (reader.Read())
        {
            var karakter = new KarakterDTO
            {
                KarakterId = (int)reader["KarakterId"],
                KarakterSoort = reader["KarakterSoort"]?.ToString(),
                KarakterNaam = reader["KarakterNaam"]?.ToString()
            };
            sortedKarakters.Add(karakter);
        }
        return sortedKarakters;
    }
}