ГДЕ имя_столбца из выпадающего списка = значение?

#c# #mysql #database

#c# #mysql #База данных

Вопрос:

Я пытаюсь найти способ выбрать значение в ComboBox, которое затем будет использоваться для команды and mysql.

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

Предполагается, что он используется в качестве фильтра для поиска в огромном стеке данных о клиентах, чтобы, например, показывать только клиентов, живущих в Берлине, или работающих как…

 if (checkBoxrecruitingsearch2.Checked)
            {
                MySqlCommand cmddtschichten = conn.CreateCommand();
                cmddtschichten.CommandType = CommandType.Text;
                cmddtschichten.CommandText = "SELECT id, Wohnort, Berufsbezeichnung FROM bewerber WHERE '"  comboBoxrecruitingfilter.Text  "' = '"   textBoxrecruitingsearch.Text   "' and '"   comboBoxrecruitingsearch2.Text   "' = '"   textBoxrecruitingsearch2.Text   "'";
                cmddtschichten.ExecuteNonQuery();
                DataTable dtschichten = new DataTable();
                MySqlDataAdapter cmddaschichten = new MySqlDataAdapter(cmddtschichten);
                cmddaschichten.Fill(dtschichten);
                dtschichten.Columns["id"].ColumnName = "Bewerber ID";
                dtschichten.Columns["Wohnort"].ColumnName = "Wohnort";
                dtschichten.Columns["Berufsbezeichnung"].ColumnName = "Berufsbezeichnung";
                BindingSource bSourceschichten = new BindingSource();

                bSourceschichten.DataSource = dtschichten;
                dataGridViewrecruitingsearchresult.DataSource = bSourceschichten;
                cmddaschichten.Update(dtschichten);
            }
            else
            {
                MySqlCommand cmddtschichten = conn.CreateCommand();
                cmddtschichten.CommandType = CommandType.Text;
                cmddtschichten.CommandText = "SELECT id, Wohnort, Berufsbezeichnung FROM bewerber WHERE '"  comboBoxrecruitingfilter.Text  "' = '"   textBoxrecruitingsearch.Text   "'";
                cmddtschichten.ExecuteNonQuery();
                DataTable dtschichten = new DataTable();
                MySqlDataAdapter cmddaschichten = new MySqlDataAdapter(cmddtschichten);
                cmddaschichten.Fill(dtschichten);
                dtschichten.Columns["id"].ColumnName = "Bewerber ID";
                dtschichten.Columns["Wohnort"].ColumnName = "Wohnort";
                dtschichten.Columns["Berufsbezeichnung"].ColumnName = "Berufsbezeichnung";
                BindingSource bSourceschichten = new BindingSource();

                bSourceschichten.DataSource = dtschichten;
                dataGridViewrecruitingsearchresult.DataSource = bSourceschichten;
                cmddaschichten.Update(dtschichten);
            }
  

ожидаемым результатом было бы вернуть все «bewerber», где столбец (выбранный в comboBoxrecruitingfilter) равен textBoxrecuitingsearch

Мне действительно показывают список со всеми записями при выполнении с пустым текстом и со списком, в противном случае он ничего не показывает

Комментарии:

1. Если я правильно помню, в mysql действительно есть определенный разделитель имен столбцов » ` «, но в вашем, где вы используете " ' " . Очень похожие, но разные символы… WHERE ' " comboBoxrecruitingfilter.Text " ' = '" textBoxrecruitingsearch.Text " ' . Помечено для закрытия как опечатка

2. итак, хм? собираюсь это проверить, спасибо. allready создал многие из тех mysql, которые запрашивают all с помощью ‘ и они, похоже, работают до сих пор

3. да, да, так оно и было. на самом деле я действительно не верил, что это поможет, но это помогло, большое спасибо @bradbury9

4. Кстати, если не всем вашим пользователям доверяют, рассмотрите возможность изменения вашего кода, вы открыты для атак с использованием SQL-инъекций

Ответ №1:

РЕШЕНИЕ

Если я правильно помню, в mysql действительно есть определенный разделитель имен столбцов » ` «, но в вашем, где вы используете » ‘ «. Очень похожие, но разные символы

 WHERE ' "  comboBoxrecruitingfilter.Text  " ' = '"   textBoxrecruitingsearch.Text   " '
  

должно быть:

 WHERE ` "  comboBoxrecruitingfilter.Text  " ` = '"   textBoxrecruitingsearch.Text   " '
  

В качестве дополнительного примечания, ваш код подвергается SQL-инъекции, если вашим пользователям не доверяют, у вас проблема с безопасностью / его могут взломать. Вместо этого следует перейти к параметризованным запросам.

Ответ №2:

Удалите ' вокруг имени поля в предложении where:

 cmddtschichten.CommandText = "SELECT id, Wohnort, Berufsbezeichnung FROM bewerber WHERE "  comboBoxrecruitingfilter.Text  " = '"   textBoxrecruitingsearch.Text   "' and "   comboBoxrecruitingsearch2.Text   " = '"   textBoxrecruitingsearch2.Text   "'";
  

и

 cmddtschichten.CommandText = "SELECT id, Wohnort, Berufsbezeichnung FROM bewerber WHERE "  comboBoxrecruitingfilter.Text  " = '"   textBoxrecruitingsearch.Text   "'";
  

Если у вас есть пробел между именами полей, вы можете использовать одно из следующих:

 cmddtschichten.CommandText = "SELECT id, Wohnort, Berufsbezeichnung FROM bewerber WHERE `"  comboBoxrecruitingfilter.Text  "` = '"   textBoxrecruitingsearch.Text   "'";
  

или

 cmddtschichten.CommandText = "SELECT id, Wohnort, Berufsbezeichnung FROM bewerber WHERE ["  comboBoxrecruitingfilter.Text  "] = '"   textBoxrecruitingsearch.Text   "'";
  

Комментарии:

1. Если в значениях combobox есть пробелы, запрос прервется. Лучшим подходом было бы использование разделителя столбцов adecuate.

2. Справедливое возражение. Тогда вы правы. Тогда вы можете использовать «, как вы сказали или [ ] . Отредактированный ответ.