Sree1981 Ответов: 1

Фильтры строк не работают с пользовательским форматом даты в VB.NET-что?


У меня есть оператор select в VB.NET как
Dim SQLString As String = "select JobNo as [Job No],Format(Date,'dd-MM-yyyy') as Date,Aluminium as [Aluminium] from actualcost"


У меня есть фильтр для поиска [Job No] между двумя заданными датами следующим образом.Он не работает из-за того, что
Format(Date,'dd-MM-yyyy') as Date
в инструкция Select. Он работает нормально, если я использую только Дата без всякого формата.

Я не могу использовать только Дата как я хочу видеть дату как 'ДД-ММ-гггг' в сетке обзора.

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

dv.RowFilter = String.Format("Convert([Job No],'System.String') Like '%{0}%' AND Date >= '{1:dd-MM-yyyy}' AND Date <= '{2:dd-MM-yyyy}'", TextBox1.Text, DateTimePicker1.Value, DateTimePicker2.Value)

Richard MacCutchan

Используйте свой отладчик для проверки сгенерированной строки.

Sree1981

Я решил эту проблему, отформатировав дату с помощью
DataGridView1.Columns("Дата").DefaultCellStyle.Формат = "ДД-ММ-гггг"
и оставил дату такой, как она есть в операторе select.Я надеюсь, что проблема была "дата преобразована в строку".Но мне действительно любопытно узнать, какое изменение в dv.filter могло бы решить проблему с тем же оператором select?

1 Ответов

Рейтинг:
1

Maciej Los

Дата-это дата, а не ее строковое представление! Чтобы получить правильные данные, вам нужно использовать правильное выражение. Видеть: объект DataColumn.Свойство Выражения (System.Data) | Microsoft Docs[^]

Итак, используйте это:

dv.RowFilter = String.Format("Convert([Job No], 'System.String') Like '%{0}%' AND [Date] >= #{1}# AND [Date] <= #{2}#", TextBox1.Text, DateTimePicker1.Value, DateTimePicker2.Value)


В случае, когда ваш источник данных содержит строковое представление даты (in Date столбец), используйте это:
dv.RowFilter = String.Format("Convert([Job No], 'System.String') Like '%{0}%' AND Convert([Date], 'System.DateTime') >= #{1::dd-MM-yyyy}# AND Convert([Date], 'System.DateTime') <= #{2:dd-MM-yyyy}#", TextBox1.Text, DateTimePicker1.Value, DateTimePicker2.Value)


Sree1981

К сожалению, это не работает.Сообщение об ошибке "строка не была распознана как допустимая Дата-Время" в обоих случаях.
Но когда я заменяю # на ', первый код работает.

Maciej Los

Не могли бы вы быть столь любезны и предоставить образцы данных?
Что такое база данных?

Sree1981

База данных-это SQL Sever Management Studio v18.4 и кодирование в Visual Studio 2019.
Имена столбцов: JobNo(тип данных - int),ALuminium(тип данных - decimal(18, 3)) и Date(тип данных - date)
ID-------------Джобно ---------- алюминий ------------ дата
6 -------------8325-------------50.000----------------2018-08-10
18 ----------- 8324-------------100.000---------------2015-02-01
19 ----------- 8324--------------75.000---------------2018-12-25

Maciej Los

Если формат даты в вашей базе данных-гггг-ММ-ДД, используйте этот формат для передачи его функции RowFilter.
;)

Sree1981

Это сводит меня с ума...Он ведет себя по-другому, когда я меняю региональный формат ПК.Нет способа сохранить один фильтр независимо от форматов дат в PC,datetimepicker,dv и SQL?