Как выполнить поиск между двумя датами в месяце и дне только в базе данных access с помощью datetimepicker c#

#c# #winforms

Вопрос:

Я хочу сделать отчет о дне рождения в datagridview в базе данных MS Access. например :

  1. 4/5/2006
  2. 4/5/2002, Если сегодняшняя дата 4/5/2021, Если я хочу выполнить поиск между 4/5 и 4/5 adp.SelectCommand.Parameters.AddWithValue("@date1", DateTime.Today); adp.SelectCommand.Parameters.AddWithValue("@date2", DateTime.Today); , это ничего не даст … что мне делать ? Весь код :
         OleDbDataAdapter da;
        DataTable dt;
    
        void FillAllRecords()
        {
    
            con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbService.accdb");
            da = new OleDbDataAdapter("SELECT * FROM service", con);
            dt = new DataTable();
            con.Open();
            da.Fill(dt);
            con.Close();
            dataGridView.DataSource = dt;
        }
    
        void FilterRecords()
        {
    
            con = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=dbService.accdb");
            con.Open();
            string sql = "SELECT *  FROM service Where p_date BETWEEN @date1 and @date2";
            DataTable dt = new DataTable();
            OleDbDataAdapter adp = new OleDbDataAdapter(sql, con);
             adp.SelectCommand.Parameters.AddWithValue("@date1", DateTime.Today);
             adp.SelectCommand.Parameters.AddWithValue("@date2", DateTime.Today);
            adp.Fill(dt);
            con.Close();
            dataGridView.DataSource = dt;
        }
           private void btnLoad2_Click(object sender, EventArgs e)
        {
            FillAllRecords();
            datetimepicker1.Visible = true;
            datetimepicker2.Visible = true;
            label1.Visible = true;
            label2.Visible = true;
            button1.Visible = true;
            btnLoad2.Visible = false;
    
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            FilterRecords();
        }
        private void btnAll_Click(object sender, EventArgs e)
        {
            FillAllRecords();
        }```
     

Комментарии:

1. Я бы попробовал adp.SelectCommand.Parameters.AddWithValue("@date2", DateTime.Today.AddDays(1);

Ответ №1:

OleDB не использует именованные параметры в строке запроса, он использует позиционные параметры. Поэтому измените строку запроса следующим образом:

 string sql = "SELECT * FROM service Where p_date BETWEEN ? and ?";
 

Просто не забудьте добавить параметры в том порядке, в котором они отображаются в запросе.

Комментарии:

1. Вы можете называть свои параметры, а не просто использовать ? . Важно то, в каком порядке добавляются параметры, но вы можете использовать любое имя (в Parameters.Add() строке запроса и в ней).

2. Да, вы можете называть параметры как угодно, но в строке запроса вы должны использовать»?». docs.microsoft.com/en-us/dotnet/api/…

3. Нет, тебе это не нужно. Вы можете использовать имя, указанное в параметре. Просто проверьте это.

4. Из документов MS: Поставщик OLE DB .NET не поддерживает именованные параметры для передачи параметров в инструкцию SQL или хранимую процедуру, вызываемую командой OLEDB, когда тип команды установлен в Текст. В этом случае необходимо использовать заполнитель вопросительного знака (?). docs.microsoft.com/en-us/dotnet/api/…

5. не поддерживает именованные параметры означает, что имена, которые вы назначаете, не принимаются во внимание, только их положение. Таким образом, вы можете использовать любые имена, которые вам нравятся, без какого-либо определенного синтаксиса- просто проверьте это .