ishuishika Ответов: 1

Проблема с опцией поиска в C#


Привет,

Я студент, делаю проект по системе управления запасами.
Я хочу использовать опцию поиска в форме продукта и форме запаса. Я этого не понимаю..
когда я использую опцию поиска, создается дополнительная таблица.. каков код для просмотра данных в одной и той же таблице gridview..
Кто-нибудь ... пожалуйста, помогите мне..

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

код, который используется для опции поиска:

частная textBox3_TextChanged недействительным(объект отправителя, EventArgs в электронной)
{
SearchData(textBox3.Text);
}

public void SearchData(поиск строк)
{
SqlConnection con = соединение.Метод getconnection();
против.Открыть();
строка запроса = "выбрать * из [акций], где [CompDiscription] как '%" + поиск + "%'";
SqlDataAdapter sda = новый SqlDataAdapter(запрос, con);
DataTable dt = новый DataTable();
ПДД.Заполнить(ДТ);
dataGridView1.Источник данных = ДТ;
против.Закрывать();
}

1 Ответов

Рейтинг:
1

OriginalGriff

"Новая таблица" создается потому, что вы явно сказали ей об этом:

DataTable dt = new DataTable();
Если вы хотите переработать существующую таблицу, то не создавайте новый экземпляр, а используйте существующий!

Но это тривиально по сравнению с главной проблемой, которую вы еще не заметили: никогда не объединяйте строки для построения 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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


ishuishika

Спасибо, сэр/мама,

я понял, что использовал новый datatable и, следовательно, дополнительную таблицу для создания.

Итак ... теперь о том, как использовать параметризованные запросы. Если я использую это, будет ли эта опция поиска работать нормально и отображаться в той же таблице, которая уже была создана?

Заранее спасибо..

OriginalGriff

Параметризованные запросы не имеют ничего общего с тем, "какую таблицу он использует" - это зависит от вас. Использование конкатенации строк-это отдельная проблема, которую вам нужно решить во всем вашем приложении, а не только в этом фрагменте кода.
Google может помочь:
https://www.google.com/search-что?q=Parameterised+queries+c%23&oq=Parameterised+queries+c%23&aqs=chrome..69i57j0l7.2102j0j7&sourceid=chrome&ie=UTF-8