#c# #winforms
Вопрос:
Я хочу сделать отчет о дне рождения в datagridview в базе данных MS Access. например :
- 4/5/2006
- 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. не поддерживает именованные параметры означает, что имена, которые вы назначаете, не принимаются во внимание, только их положение. Таким образом, вы можете использовать любые имена, которые вам нравятся, без какого-либо определенного синтаксиса- просто проверьте это .