Рейтинг:
6
Patrice T
Убедиться date
соответствие формату dateTimePicker1
и dateTimePicker2
формат. Для сравнения дат в тексте необходимо использовать формат yyyymmdd.
string query = "select * from Finaldetails where (" + this.comboBox1.SelectedItem + ") LIKE ('" + this.textBox1.Text + "') and Date between '" + this.dateTimePicker1.Text + "' and '" + this.dateTimePicker2.Text + "' and Status = 'Approved'";
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[
^]
SQL-инъекция[
^]
Атаки SQL-инъекций на примере[
^]
PHP: SQL-инъекция - руководство пользователя[
^]
Шпаргалка по предотвращению инъекций SQL - OWASP[
^]
Prateek gsharma
я буду использовать формат yyyymmdd для datetimepickere
Prateek gsharma
я не получаю результатов, сэр.не могли бы вы, пожалуйста, дать мне еще один пример с кодом.если это возможно?
Рейтинг:
15
Wendelius
Основная проблема заключается в том, что вы объединяете данные из объектов пользовательского интерфейса непосредственно в свой оператор SQL. Это создает проблемы преобразования и оставляет вас открытым для SQL-инъекций.
Правильный способ сделать это-использовать Класс OleDbParameter (System.Data.Для oledb)[^]
Таким образом, код должен выглядеть примерно так
OleDbConnection con2 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\Consoldetails.accdb");
private void button4_Click(object sender, EventArgs e)
{
OleDbCommand command = new OleDbCommand();
command.Connection = con2;
string query = "select * from Finaldetails where (" + this.comboBox1.SelectedItem + ") LIKE (?) and Date between ? and ? and Status = 'Approved'";
command.CommandText = query;
command.Parameters.Add("@v1", OleDbType.VarChar, 100).Value = this.textBox1.Text;
command.Parameters.Add("@v2", OleDbType.Date).Value = this.dateTimePicker1.Text;
command.Parameters.Add("@v3", OleDbType.Date).Value = this.dateTimePicker2.Text;
OleDbDataAdapter da = new OleDbDataAdapter(command);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
con2.Close();
}
Я не знаю фактических типов данных, поэтому вам придется приспосабливаться к коду, основанному на требованиях. Кроме того, у меня нет компилятора под рукой, так что извините за любые опечатки.
Для получения дополнительных примеров взгляните на
Правильное выполнение операций с базой данных[
^]. Несмотря на то, что в примере используются SqlParameters, идея остается той же
Prateek gsharma
я не понял вас, сэр?
Wendelius
В данный момент Вы связываете значения с запросом. Это, скорее всего, предотвращает корректное преобразование текста в дату. Например, если ваша локальная настройка даты равна dd/mm/yyyy, но база данных ожидает mm/dd/yyyy, то данные преобразуются неправильно.
Чтобы избежать таких проблем наряду с SQL-инъекцией, всегда следует использовать параметры при предоставлении значений из пользовательского интерфейса в запрос. Вот для чего нужен OleDbParameter.
Prateek gsharma
спасибо, сэр, я попробую это сделать прямо сейчас
Prateek gsharma
данный код тоже не работает, сэр.
Wendelius
Не могли бы вы быть более конкретными: получаете ли вы ошибки, извлекаете ли неправильные данные или что-то еще?
Prateek gsharma
я ничего не получаю,просто пустое место datagridview.no ошибка тоже.
можете ли вы создать одну форму windows с таким же дизайном и прояснить сомнения, если это возможно, сэр.
Wendelius
Вы можете использовать отладчик, чтобы увидеть, что происходит. Например поместите точку останова на
да.Заполнить(ДТ);
и после того, как вы выполните эту строку, с помощью Watch посмотрите, содержит ли таблица данных какие-либо строки. Также перед выполнением вы можете проверить правильность значений параметров и наличие ожидаемых дат. Например, довольно часто случается, что значения между состояниями смешиваются. Сначала должна быть меньшая дата, а затем последняя дата. Если они наоборот, ничего не возвращается.