Johnny Sins Ответов: 1

Поиск двух столбцов в mysql C#


у меня есть текстовое поле поиска. Теперь если я буду искать
--------------
| Калифорния 87|
---------------
Местоположение и номер местоположения. В моем представлении datagrid не будет никаких выходных данных.

 int i = 0;
 dgv_bene.Rows.Clear();
 cn.Open();
 cm = new MySqlCommand("SELECT `b_id`, concat_ws(' ', `b_lname`, `b_fname`) as `applicant_name`, concat_ws(' ', `b_slname`, `b_sfname`) as `spouse_name`, `b_type`, `b_location`, `b_block`, `b_lot`, `p_owner` from benefciiary where (b_location + ' ' +  b_block) like '"+tb_search.Text+"%' ", cn);


dr = cm.ExecuteReader();
 while (dr.Read())
 {
     i += 1;
     dgv_bene.Rows.Add(i, dr[0].ToString(), dr[1].ToString(),
     dr[2].ToString(), dr[3].ToString(), dr[4].ToString(), dr[5].ToString(),
     dr[6].ToString(), dr[7].ToString());
 }
 dr.Close();
 cn.Close();


Что я уже пробовал:

Я попытался concat_ws(). но это ошибка

PIEBALDconsult

Пожалуйста, исследуйте параметризованные запросы.

1 Ответов

Рейтинг:
2

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Во - вторых, мы ничего не можем сделать, чтобы помочь вам в этом: у нас нет доступа к вашей базе данных или к входным данным вашего пользователя-и то и другое требуется, чтобы понять, что происходит.
Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.
Я бы начал с просмотра входных данных tx_search.Текст и просмотр количества возвращаемых строк, а затем выполнение ручного выбора БД с использованием той же таблицы и предложения LIKE. Я бы заподозрил, что вы неправильно написали "Калифорния", но без вашей базы данных и входных данных мы не можем сказать!

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Johnny Sins

Спасибо. У меня уже есть 2 решения в моей голове. Надеюсь, это сработает. хаха