Ne pas get la date correcte de la database

Ne pas get la date correcte de la database sur les lignes suivantes. La date réelle dans la database est 04/30/2016 21:30:00 PM mais je l'obtiens comme 01/01/0001 12:00:00 AM. Pas sûr de ce qui se passe.

DateTime fromDb = sqlReader.GetDateTime(1); DateTime toDb = sqlReader.GetDateTime(2); 

Voici la méthode complète:

  private bool IsRoomAlreadyTaken(Ssortingng room, DateTime fromUser, DateTime toUser) { bool roomAlreadyTaken = false; using (SqlConnection sqlConnection = new SqlConnection(connectionSsortingng)) { SqlCommand sqlCmd = new SqlCommand("SELECT Id, convert(varchar(30), DateFrom, 131), convert(varchar(30), DateTo, 131) FROM Access_Privilege where RoomId = @RoomId", sqlConnection); sqlCmd.Parameters.AddWithValue("@RoomId", room); sqlConnection.Open(); SqlDataReader sqlReader = sqlCmd.ExecuteReader(); while (sqlReader.Read()) { DateTime fromDb = sqlReader.GetDateTime(1); //On this line DateTime toDb = sqlReader.GetDateTime(2); //On this line if (DateTime.Compare(fromUser, fromDb) == 0 && TimeSpan.Compare(fromUser.TimeOfDay, fromDb.TimeOfDay) > 0 && TimeSpan.Compare(toUser.TimeOfDay, toDb.TimeOfDay) <0) { roomAlreadyTaken = true; } } sqlReader.Close(); } return roomAlreadyTaken; } 

Modifiez après avoir essayé les suggestions suivantes de @ManOVision:

De la docs: "Aucune conversion n'est effectuée, par conséquent, datatables récupérées doivent déjà être un object DateTime." J'ai eu des problèmes dans le passé avec SqlDataReader.Get[type] avant. Essayez de le Convert.ToDateTime(sqlReader.GetValue(1).ToSsortingng()) en Convert.ToDateTime(sqlReader.GetValue(1).ToSsortingng()) ou au less vérifiez ce que sqlReader.GetValue(1) renvoie de la database.

Résultats, avec les lignes suivantes modifiées:

 MessageBox.Show("sqlReader.GetValue(1)-->" + sqlReader.GetValue(1)); MessageBox.Show("sqlReader.GetValue(2)-->" + sqlReader.GetValue(2)); DateTime fromDb = Convert.ToDateTime(sqlReader.GetValue(1).ToSsortingng()); DateTime toDb = Convert.ToDateTime(sqlReader.GetDateTime(2).ToSsortingng()); 

sqlReader.GetValue(1) renvoie 23/07/1437 9:30:12:000 PM et sqlReader.GetValue(2) renvoie le 23/07/1437 10:30:12:483 PM . Avec GetValue() , le time semble avoir été returnné correctement, mais la date est toujours foirée. Cette expérience prouve que l'logging renvoyé par la database est le bon. Mais la valeur de date est toujours perdue lors de la conversion.

Lors de la poursuite de l'exécution du programme, Convert.ToDateTime(sqlReader.GetValue(1).ToSsortingng()) renvoie l'erreur suivante:

 Ssortingng was not recognized as a valid DateTime. at System.DateTimeParse.Parse(Ssortingng s, DateTimeFormatInfo dtfi, DateTimeStyles styles) at System.Convert.ToDateTime(Ssortingng value) at SGFinalProjectRoomAllocationSystem.ManageAccessForm.IsRoomAlreadyTaken(Ssortingng room, DateTime fromUser, DateTime toUser) in c:\Projects\SGFinalProjectRoomAllocationSystem\SGFinalProjectRoomAllocationSystem\ManageAccessForm.cs:line 222 at SGFinalProjectRoomAllocationSystem.ManageAccessForm.ValidatePrivilegs(Ssortingng emp, Ssortingng room, DateTime from, DateTime to) in c:\Projects\SGFinalProjectRoomAllocationSystem\SGFinalProjectRoomAllocationSystem\ManageAccessForm.cs:line 246 at SGFinalProjectRoomAllocationSystem.ManageAccessForm.grntAccssBtn_Click(Object sender, EventArgs e) in c:\Projects\SGFinalProjectRoomAllocationSystem\SGFinalProjectRoomAllocationSystem\ManageAccessForm.cs:line 283 at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at SGFinalProjectRoomAllocationSystem.Program.Main() in c:\Projects\SGFinalProjectRoomAllocationSystem\SGFinalProjectRoomAllocationSystem\Program.cs:line 19 

Les methods de conversion causaient le problème. Les supprimer de la requête l'a résolu.

Code avec le problème:

 SqlCommand sqlCmd = new SqlCommand("SELECT Id, convert(varchar(30), DateFrom, 131), convert(varchar(30), DateTo, 131) FROM Access_Privilege where RoomId = @RoomId", sqlConnection); 

Code de travail.

 SqlCommand sqlCmd = new SqlCommand("SELECT Id, DateFrom, DateTo FROM Access_Privilege where RoomId = @RoomId", sqlConnection); 

Essayez la méthode DateTime.Parse . MSDN

DateTime fromDb = DateTime.Parse(sqlReader[1].ToSsortingng()); DateTime toDb = DateTime.Parse(sqlReader[2].ToSsortingng());

Ou Essayez la méthode DateTime.TryParse . MSDN

DateTime fromDb;

if(DateTime.TryParse(sqlReader[1].ToSsortingng(), out fromDb)) //Conversion Successful. fromDb is set else //Conversion Unsuccessful

De la docs : "Aucune conversion n'est effectuée, par conséquent, datatables récupérées doivent déjà être un object DateTime."

J'ai eu des problèmes dans le passé avec SqlDataReader.Get [type] avant. Essayez de le Convert.ToDateTime(sqlReader.GetValue(1).ToSsortingng()) en Convert.ToDateTime(sqlReader.GetValue(1).ToSsortingng()) ou au less vérifiez ce que sqlReader.GetValue(1) renvoie de la database.