Данные пользователей сохраняют только одну запись в ms access
Я пытаюсь сохранить данные о времени пользователя в базе данных между двумя датами, а затем распечатать их в crystal reports, но я получаю только одну дату вместо всех дат, которые у него есть. Чего мне не хватает в моем коде:
Public Sub getLogs(ByVal id As Integer, ByVal fromDate As Date, ByVal toDate As Date) Dim startDay, endDay As Date conn1 = New OleDbConnection conn1.ConnectionString = conCopy conn4 = New OleDbConnection conn4.ConnectionString = conCopy Dim query, query2 As String Try conn1.Open() query = "SELECT USERID,CHECKDATE," _ & "MIN(IIF(CHECKTYPE='Check In',CHECKTIME,NULL) ) AS 'AM IN', " _ & "MIN(IIF(CHECKTYPE='Break Out',CHECKTIME,NULL) ) AS 'LUNCH OUT', " _ & "MAX(IIF(CHECKTYPE='Break In',CHECKTIME,NULL) ) AS 'LUNCH IN', " _ & "MAX(IIF(CHECKTYPE='Check Out',CHECKTIME,NULL) ) AS 'PM OUT' " _ & "FROM CHECKINOUT WHERE USERID = @ID " _ & "GROUP BY USERID, CHECKDATE" cmd = New OleDbCommand(query, conn1) cmd.Parameters.Clear() cmd.Parameters.AddWithValue("@ID", Integer.Parse(id)) Dim reader As OleDbDataReader = cmd.ExecuteReader conn4.Open() query2 = "INSERT INTO LOGDATES(ID,CHECKDATE,AMIN,LUNCHOUT,LUNCHIN,PMOUT) " _ & "VALUES(@ID,@DATE,@AM,@LOUT,@LIN,@PM)" cmd2 = New OleDbCommand(query2, conn4) startDay = DateTime.Parse(fromDate) endDay = DateTime.Parse(toDate) If reader.HasRows Then While reader.Read Do While startDay <= endDay With cmd2 .Parameters.Clear() .Parameters.AddWithValue("@ID", reader.Item(0)) .Parameters.AddWithValue("@DATE", DateTime.Parse(startDay).ToString("MM/dd/yyyy")) If DateTime.Parse(startDay).ToString("MM/dd/yyyy") = DateTime.Parse(reader.Item(1)).ToString("MM/dd/yyyy") Then If Not IsDBNull(reader.Item(2)) Then .Parameters.AddWithValue("@AM", DateTime.Parse(reader.Item(2)).ToString("HH:mm tt")) Else .Parameters.AddWithValue("@AM", DBNull.Value) End If If Not IsDBNull(reader.Item(3)) Then .Parameters.AddWithValue("@LOUT", DateTime.Parse(reader.Item(3)).ToString("HH:mm tt")) Else .Parameters.AddWithValue("@LOUT", DBNull.Value) End If If Not IsDBNull(reader.Item(4)) Then .Parameters.AddWithValue("@LIN", DateTime.Parse(reader.Item(4)).ToString("HH:mm tt")) Else .Parameters.AddWithValue("@LIN", DBNull.Value) End If If Not IsDBNull(reader.Item(5)) Then .Parameters.AddWithValue("@PM", DateTime.Parse(reader.Item(5)).ToString("HH:mm tt")) Else .Parameters.AddWithValue("@PM", DBNull.Value) End If Else .Parameters.AddWithValue("@AM", DBNull.Value) .Parameters.AddWithValue("@LOUT", DBNull.Value) .Parameters.AddWithValue("@LIN", DBNull.Value) .Parameters.AddWithValue("@PM", DBNull.Value) End If .ExecuteNonQuery() End With startDay = startDay.AddDays(1) Loop End While Else Do While startDay <= endDay With cmd2 .Parameters.Clear() .Parameters.AddWithValue("@ID", Integer.Parse(id)) .Parameters.AddWithValue("@DATE", DateTime.Parse(startDay).ToString("MM/dd/yyyy")) .Parameters.AddWithValue("@AM", DBNull.Value) .Parameters.AddWithValue("@LOUT", DBNull.Value) .Parameters.AddWithValue("@LIN", DBNull.Value) .Parameters.AddWithValue("@PM", DBNull.Value) .ExecuteNonQuery() End With startDay = startDay.AddDays(1) Loop End If conn1.Close() conn4.Close() reader.Close() Catch ex As Exception MsgBox(ex.Message) End Try Form2.Show() End Sub
Что я уже пробовал:
Я уже проверил запрос в ms access, и он действительно вернул все данные пользователей между датами, так что ошибка находится внутри моего vb-кода. Пожалуйста помочь....
phil.o
DateTime.Parse(fromDate)
Почему ты пытаешься разобрать в DateTime
цените то, что уже является правильным DateTime
ценность? Я даже удивлен, что этот код компилируется, потому что Parse
метод принимает String
значение, не DateTime
ценность.Parse
методы предназначены для тех случаев, когда у вас есть String
представление значения, из которого вы хотите получить правильное значение обратно.
Совет: вам не нужно ничего преобразовывать в строку, пока вы не захотите представить это значение конечному пользователю. Всегда работайте с правильными типами в первую очередь, и избегайте делать ставки назад и вперед от значения к строке. Например, чтобы сравнить две даты, сравните DateTime
значения непосредственно, не сравнивайте их string
представления.
И для вашего вопроса: поставьте точку останова в начале вашего метода, нажмите клавишу F5 и отладьте оттуда. Вам нужна помощь в использовании отладчика?
Richard Deeming
Он компилируется, потому что это VB.NET с помощью Option Strict Off
- этот - просто компилируй, черт возьми!" флаг. :)