Несоответствие типа данных в выражении критериев в vb.net с доступом 2010

 Dim QRY As String = "SELECT t1.Observer_Name,t1.Company, t2.Safety, t2.T_Name, t2.Trainer_Name," _
                               + "t2.T_Location, t2.T_Start, t2.T_End,(DateDiff(""d"",T_Start, T_End)+1)*8 as [Man_Hours], t2.Remarks" _
                               + " FROM ObserverDetails t1,Training t2,TrainningAttendee t3" _
                               + " WHERE t2.T_ID=t3.T_ID AND t3.Ob_ID=t1.Observer_ID And  t2.T_Start >= @dt1 AND t2.T_Start <= @dt2 "
        cmdSelect.CommandText = QRY
        cmdSelect.Parameters.Add("@dt1", OleDb.OleDbType.Char).Value = DateTimePicker1.Text.Trim
        cmdSelect.Parameters.Add("@dt2", OleDb.OleDbType.Char).Value = DateTimePicker2.Text.Trim
        cmdSelect.CommandType = CommandType.Text
        cmdSelect.Connection = reportConnection4

        reader1 = cmdSelect.ExecuteReader
        If reader1.Read Then
            While reader1.Read
                Dim row As String() = New String() {" " & reader1.Item("Observer_Name") & " ", "" & reader1.Item("Company") & "", " " & reader1.Item("Safety") & " ", " " & reader1.Item("T_Name") & "", _
                                                   "" & reader1.Item("Trainer_Name") & " ", " " & reader1.Item("T_Location") & "", "" & reader1.Item("T_Start") & "", _
                                                   "" & reader1.Item("T_End") & " ", "" & reader1.Item("Man_Hours") & " ", "" & reader1.Item("Remarks") & " "}
                DataGridView1.Rows.Add(row)
            End While
        End If

выдает ошибку reader = cmdSelect.ExecuteReader. Ошибка несоответствие типа данных в выражении критерия.


person Harshal Pathak    schedule 21.08.2014    source источник
comment
Где соответствующая часть, а именно объявление reader1?   -  person Olivier Jacot-Descombes    schedule 21.08.2014
comment
вы, кажется, оцениваете даты как текст ... это, вероятно, не закончится хорошо. если T_Start — это столбец даты, который объясняет несоответствие данных переданному тексту.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.08.2014
comment
ya объявляется в начале Public Sub   -  person Harshal Pathak    schedule 21.08.2014
comment
В вашей базе данных какой тип данных у поля T_Start?   -  person Steve    schedule 21.08.2014
comment
эта логика работает для другой формы @Plutonix   -  person Harshal Pathak    schedule 21.08.2014
comment
@Steve, его дата/время доступа к MS   -  person Harshal Pathak    schedule 21.08.2014
comment
вы передаете текст - DTP.Text и хотите, чтобы БД обрабатывала его как Date в предложении WHERE. В этом смысл ошибки. Сравнение дат в текстовой форме не будет работать в долгосрочной перспективе. 1 сентября 1900 г. будет оцениваться больше, чем 31 декабря 2015 г., потому что 9 больше 1. Используйте даты для выполнения операций, связанных с датами.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.08.2014
comment
Не могли бы вы показать нам, каково значение DateTimePicker1.Text и DateTimePicker2.Text?   -  person Steve    schedule 21.08.2014


Ответы (1)


Если ваша команда System.Data.OleDb.OleDbCommand, то ваш ридер должен быть System.Data.OleDb.OleDbDataReader или его базовым типом (DbDataReader или IDataReader).

Dim reader1 As OleDbDataReader

Или неявно

Dim reader1 = cmdSelect.ExecuteReader()

Вы можете использовать AddWithValue, чтобы автоматически получить параметр с правильным типом. Если типом вашей базы данных является Дата/Время, передайте дату как Date, а не как строку (как говорили другие в комментариях).

cmdSelect.Parameters.AddWithValue("@dt1", DateTimePicker1.Value)

Проблема со строками (в дополнение к несоответствию типов данных) заключается в том, что текстовое представление даты всегда зависит от культуры, используемой для форматирования. Если БД предполагает другой язык и региональные параметры, то что-то может пойти не так. США 07.05.2014 (м/д/гггг) не совпадает с британским 07.05.2014 (д/м/гггг)!

person Olivier Jacot-Descombes    schedule 21.08.2014
comment
только его OleDbDataReader - person Harshal Pathak; 21.08.2014
comment
System.Data.OleDb — это пространство имен, которое вы, вероятно, импортировали и поэтому не указали в операторе Dim. - person Olivier Jacot-Descombes; 21.08.2014