Member 13132705 Ответов: 2

C# показывает данные между двумя датами в datagridview. Даты из datetimepicker или текстового поля


Я работаю над кодом на языке C#, где я использовал строку подключения OLEDB для подключения базы данных MS access. У меня есть форма, где я показываю данные из базы данных в datagridview по некоторым критериям. Ниже приведены критерии:

а) человек (пришел из базы данных в)

б) процесс (исходящий из базы данных в текстовом поле)

c) от даты (Datetimepicker)

d) На сегодняшний день (Datetimepicker)

Результат, который я хочу: сначала я выбираю человека, а затем процесс и чем от даты, а затем до даты и нажимаю на кнопку просмотра. который должен показывать данные из MS-Access на основе вышеуказанных критериев, которые я выбрал.

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

1. для фильтра человека и процесса:
DataView DV = new DataView(dt1);
        DV.RowFilter = string.Format("[Person] LIKE '%{0}%'", textBox5.Text);
        dataGridView1.DataSource = DV;

Для даты времени между двумя датами я перепробовал много и Google lots, но не нашел ответа. Я попробовал ниже:
один)
SqlConnection con = new 
        SqlConnection(ConfigurationManager.ConnectionStrings["connection"].ConnectionString);
        string queryString = "";
        queryString = "SELECT * FROM Table1 WHERE dob BETWEEN @startdate AND @enddate";
        System.Data.SqlClient.SqlCommand sqlCmd = new System.Data.SqlClient.SqlCommand(queryString, con);
        sqlCmd.Parameters.Add("@startdate", System.Data.SqlDbType.Date).Value = textBox7.Text;
        sqlCmd.Parameters.Add("@enddate", System.Data.SqlDbType.Date).Value = textBox8.Text;
        System.Data.SqlClient.SqlDataAdapter dataAdapter = new System.Data.SqlClient.SqlDataAdapter(sqlCmd);
        System.Data.DataSet dataSet = new System.Data.DataSet();
        dataAdapter.Fill(dataSet);
        GridView1.DataSource = dataSet;
        GridView1.DataBind();
b)

        string FD = "";
        FD = dateTimePicker4.Value.ToString("dd-MM-yyyy");
        string TD = "";
        TD = dateTimePicker5.Value.ToString("dd-MM-yyyy");
        connection.Close();
        connection.Open();
        OleDbCommand command123 = new OleDbCommand();
        command123.Connection = connection;
        string query123 = "select * from Table1 where [P Date] between date '"# + dateTimePicker4.Text.ToString() + #"' and date '"# + dateTimePicker5.Text.ToString() + #"'"
        command123.CommandText = query123;
        OleDbDataAdapter da123 = new OleDbDataAdapter(command123);
        DataTable dt123 = new DataTable();
        da123.Fill(dt123);
        dataGridView1.DataSource = dt123;
c)

        DataTable dt = new DataTable();
        da.Fill(dt);
        DataView DV = new DataView(dt1);
        DV.RowFilter = string.Format("[P Date] >=" + textBox7.Text + " and <" + textBox8.Text + "");
        dataGridView1.DataSource = DV;
d)

        DataTable dt1 = new DataTable();
        DataView DV = new DataView(dt1);
        //DV.RowFilter = "[P Date] IN (#11/01/2019#, #11/11/2019#)";
        //DV.RowFilter = "[P Date] >=#"+dateTimePicker4.Text+"# and [P Date] <=#"+dateTimePicker5.Text+"#";
        //dataView.RowFilter = "Date IN (#12/31/2008#, #1/1/2009#)" // date time values
        //DV.RowFilter ="([P Date] >=CDate('dateTimePicker4.Text')) and ([P Date] <=CDate('dateTimePicker5.Text'))";
        //DV.RowFilter = string.Format(CultureInfo.InvariantCulture.DateTimeFormat, "([P Date]>=#{dateTimePicker4.text}#) and ([P Date] <=#{dateTimePicker5.Text}#)");
        dataGridView1.DataSource = DV;

Для подключения я пытаюсь подключиться к OLEDB.
    connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=DatabasePath.accdb;
    Jet OLEDB:Database Password=password";
connection.Close();
connection.Open();
OleDbCommand command1 = new OleDbCommand();
command1.Connection = connection;
//Select all column use belw query
string query = "select * from Table1";
command1.CommandText = query;
OleDbDataAdapter da = new OleDbDataAdapter(command1);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
connection.Close();


этот код работает, но проблема в том, что он показывает все данные, не основанные на критериальных данных.

Я ожидаю вывода в Datagridview на основе всех критериев. Показывать только те данные, которые подпадают под все критерии.

2 Ответов

Рейтинг:
16

OriginalGriff

Вместо того, чтобы использовать между:

DateColumn BETWEEN startDate AND endDate

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

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


Рейтинг:
12

RickZeeland

Попробуйте отформатировать значения даты следующим образом:

Where [P Date] Between #" + dateTimePicker4.Value.ToString("yyyy'/'MM'/'dd") + "# And #" + dateTimePicker5.Value.ToString("yyyy'/'MM'/'dd") + "#"


Member 13132705

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