С# SQL-запрос с пользовательским вводом

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

try
        {
            using (connection = new SqlConnection(connectionString))
            {
                if (connection.State == ConnectionState.Closed)
                    connection.Open();
                using(DataTable dt = new DataTable("Search"))
                {
                    using(SqlCommand cmd = new SqlCommand("SELECT * FROM books WHERE name = @name OR name LIKE @name", connection))
                    {
                        cmd.Parameters.AddWithValue("@name", txtboxSearchName.Text);
                        cmd.Parameters.AddWithValue("author", string.Format("%{0}%", txtboxSearchAuthor.Text));
                        SqlDataAdapter adapter = new SqlDataAdapter();
                        adapter.Fill(dt);
                        dataGridView1.DataSource = dt;
                    }
                }
            }
        }
        catch (Exception)
        {
            MessageBox.Show("Something went wrong", "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

Убедитесь, что вы не злоупотребляете тегами. Я убрал для вас тег [visual-studio].

DiplomacyNotWar 06.05.2022 18:34

Как бы вы хотели собирать пользовательский ввод? Требуется ли вам разработать пользовательский интерфейс с текстовым полем для ввода условий поиска? Ваш вопрос о том, как написать метод С# с входными данными, которые вы затем вводите в запрос? Мне трудно понять, о чем вы спрашиваете. Пожалуйста, улучшите свой вопрос.

lunarquaker 06.05.2022 18:38
name = @name OR name LIKE @name один из них должен быть автор? потому что иначе это утверждение не имеет смысла
Steve 06.05.2022 18:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы почти выполнили задание; тем не менее, некоторые проблемы должны быть исправлены:

try {
  // Remove old DataSource if any
  if (dataGridView1.DataSource is IDisposable old)
    old.Dispose();

  using (connection = new SqlConnection(connectionString)) {
    // Let sql be readable
    // name = @name seems to be redundant: LIKE is broader in the context
    string sql = 
       @"SELECT * 
           FROM books 
          WHERE name LIKE @name";

    using(SqlCommand cmd = new SqlCommand(sql, connection)) {
      // Your command uses just one parameter - @name; no @author is used  
      cmd.Parameters.AddWithValue("@name", txtboxSearchName.Text);

      // SqlDataAdapter must know which command to use
      SqlDataAdapter adapter = new SqlDataAdapter(cmd);

      DataTable dt = new DataTable("Search");

      adapter.Fill(dt);
      dataGridView1.DataSource = dt;
    }
  }
}
catch (DbException e) { // Don't catch (= swallow) all the exception 
  // Message: let user know what went wrong - e.Message
  MessageBox.Show($"Something went wrong: {e.Message}", 
                   "Error", 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Error);
}  
Ответ принят как подходящий

Из того, что я понял, вы пытаетесь найти что-то в своей базе данных

ваш запрос выглядит так:

 SELECT * FROM books WHERE name = @name OR name LIKE @name
  • знак знак равно означает, что имя должно совпадать с параметром @name

  • оператор «НРАВИТСЯ» используется в предложении WHERE для поиска указанного шаблона в столбце.

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

 SELECT * FROM books WHERE name = @name 

если вы ищете книги с именами, похожими на @name, вы можете использовать:

SELECT * FROM books WHERE name like @name

при использовании подобного оператора вы должны использовать %, чтобы указать сходство обратитесь к этой статье, чтобы вы могли понять

я думаю, в вашем случае лайк для автора

вот ваше окончательное исправление:

    using(SqlCommand cmd = new SqlCommand("SELECT * FROM books WHERE name = @name OR name LIKE @author", connection))
                        {
                            cmd.Parameters.AddWithValue("@name", txtboxSearchName.Text);
// you were missin an @ in author parameter
                            cmd.Parameters.AddWithValue("@author", string.Format("%{0}%", txtboxSearchAuthor.Text));
                            SqlDataAdapter adapter = new SqlDataAdapter();
                            adapter.Fill(dt);
                            dataGridView1.DataSource = dt;
                        }

Другие вопросы по теме