Prateek gsharma Ответов: 2

Я не получаю никаких результатов при фильтрации базы данных с помощью datetimepicker, combobox, textbox.


Привет,

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

У меня есть,

Combobox - 1
Текстовое поле - 1
Datetimepicker - 2

у меня есть база данных фильтров с использованием Comboboxselecteditem,textbox1.text и datetimepicker1 и datetimepicker2.

может ли кто-нибудь предложить меня?

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

Вот мой код,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Configuration;
using System.Data.SqlClient;

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 ('" + this.textBox1.Text + "') and  Date between '" + this.dateTimePicker1.Text + "' and '" + this.dateTimePicker2.Text + "' and Status = 'Approved'";

   command.CommandText = query;
   OleDbDataAdapter da = new OleDbDataAdapter(command);
   DataTable dt = new DataTable();
   da.Fill(dt);
   dataGridView1.DataSource = dt;
   con2.Close();
}

2 Ответов

Рейтинг:
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 посмотрите, содержит ли таблица данных какие-либо строки. Также перед выполнением вы можете проверить правильность значений параметров и наличие ожидаемых дат. Например, довольно часто случается, что значения между состояниями смешиваются. Сначала должна быть меньшая дата, а затем последняя дата. Если они наоборот, ничего не возвращается.