R45H1D Ответов: 3

Фильтр datagrid между двумя датами в C#


привет, ребята! у меня есть два сборщика дат. и я хочу заполнить сетку данных между выбранными датами из сборщиков дат. мой код не работает.

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

OleDbCommand cmd = new OleDbCommand("SELECT * FROM invoice where DateTime between '" + dateTimePicker1.Value.ToString() + "' AND '" + dateTimePicker2.Value.ToString() + "'",con);
            con.Open();
            OleDbDataReader sdr = cmd.ExecuteReader();
            if ((sdr.Read() == true))
            {
                DataSet ds = new DataSet();
                da.Fill(ds, "invoice");
                dataGridView1.DataSource = ds.Tables["invoice"];
                //dataGridView1.DataSource = sdr;

            }
            else
            {
                MessageBox.Show("query not executed");
            }

CHill60

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

3 Ответов

Рейтинг:
27

Mehdi Gholam

Попробовать это :

OleDbCommand cmd = new OleDbCommand("SELECT * FROM invoice where DateTime between '" + dateTimePicker1.Value.ToString() + "' AND '" + dateTimePicker2.Value.ToString() + "'",con);
con.Open();
DataSet ds = new DataSet();
da.Fill(ds, "invoice");
dataGridView1.DataSource = ds.Tables["invoice"];


CHill60

Этот код все еще уязвим для атаки SQL-инъекций.

R45H1D

как предотвратить его от sql-инъекции?

R45H1D

братан выше кода дает мне эту ошибку. в этой строке (da.Fill(ds, "счет-фактура");)
Ссылка на объект не устанавливается на экземпляр объекта.

Mehdi Gholam

Я предположил, что ваш код работает, убедитесь, что сначала инициализируется "da" SQLDataAdapter.

R45H1D

теперь эта ошибка на той же линии.
Свойство SelectCommand не было инициализировано перед вызовом функции 'Fill'.

R45H1D

перед этой строкой я пишу эту строчку .
да.Команды selectcommand = ЦМД;
теперь он не показывает никаких ошибок, но и не показывает данные в виде сетки. отображаются только имена столбцов. но строки не отображаются. помоги мне Братан

Рейтинг:
18

CHill60

Эта работа

string connectionstring = Settings.Default.SandboxConnectionString;
using (OleDbConnection con = new OleDbConnection(connectionstring))
{
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM invoice where DateTime between @date1 AND @date2", con);
    cmd.Parameters.AddWithValue("@date1", dateTimePicker1.Value);
    cmd.Parameters.AddWithValue("@date2", dateTimePicker2.Value);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);

    con.Open();
    DataSet ds = new DataSet();
    da.Fill(ds, "invoice");
    dataGridView1.DataSource = ds.Tables["invoice"];
}

Но только в том случае, если в таблице действительно есть данные, соответствующие выбранным мною датам.
Что нужно отметить:
1. я использовал параметризованный запрос.
2. Нет .ToString() для значений dateTimePicker
3. Вы действительно должны перечислить столбцы, которые вы хотите вернуть из таблицы, т. е. использовать
SELECT col1, col2, ..., colN FROM invoice
вместо
SELECT * from invoice

4. Вы должны избегать использования зарезервированных слов для имен столбцов в таблицах - используйте InvoiceDate скорее, чем DateTime например


R45H1D

когда я запускаю этот код, он показывает эту ошибку в строке con.open ()...
Свойство connectionString не инициализировано

CHill60

Вы должны заменить свою собственную строку соединения - у вас было соединение con в вашем первоначальном посте - используйте это.

R45H1D

этот код не работает, братан. он отображает только имена столбцов. но не рядами

CHill60

В этом случае у вас в таблице нет счетов-фактур, соответствующих датам, которые вы вводите. Если бы он вообще "не работал", то вы бы тоже не получили названия столбцов.

Рейтинг:
10

R45H1D



OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM invoice where DateTime between '" +
            dateTimePicker1.Value.ToShortDateString() + "' AND '" + dateTimePicker2.Value.ToShortDateString() +
                "'", con);
           
            DataSet ds = new DataSet();

            da.SelectCommand = cmd;
            con.Open();
            da.Fill(ds, "invoice");
            dataGridView1.DataSource = ds.Tables["invoice"];
            con.Close();
        }


Member 12654684

решение 2 работает идеально