Bonjour,

Je rencontre actuellement un problème sur une requête, je souhaite récupérer les vauleurs de mes champs DT_DEB et DT_FIN qui sont des DateTime dans ma base.

Seulement, j'obtiens cette erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Cannot cast DBNull.Value to type 'System.DateTime'. Please use a nullable type.
Voici mon contrôleur récupérant les champs de ma requêtes avec les clauses where :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 public ActionResult PageLogs(string CR, string Appli, string TRT)
        {
            var items = GetLogs();
 
            string GetCR = CR;
            string GetAppli = Appli;
            string GetTRT = TRT;
 
 
            var Query = (from i in items
                         where i.Field<String>("CD_APPLI") == GetAppli && i.Field<String>("CD_CR") == GetCR && i.Field<String>("CD_TRT") == GetTRT
                         select new Suivi { CD_JOB = i.Field<String>("CD_JOB"), CD_TRT = i.Field<String>("CD_TRT"), CD_TYP_TRT = i.Field<String>("CD_TYP_TRT"),
                                            CD_TRT_SSIS = i.Field<string>("CD_TRT_SSIS"), DT_DEB = i.Field<DateTime>("DT_DEB"), DT_FIN = (DateTime)i.Field<DateTime?>("DT_FIN"),
                                            STATUT = i.Field<string>("STATUT"), PERIODE = i.Field<Int64>("PERIODE"), TIMING = i.Field<string>("TIMING"),
                                            CD_APPLI = i.Field<String>("CD_APPLI")}).ToList();
 
            ViewData["CR"] = GetCR;
            ViewData["Appli"] = GetAppli;
            ViewData["TRT"] = GetTRT;
 
            return View(Query);
        }
Ma méthode GetLogs() exécutant la requête initiale sans condition :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
private List<DataRow> GetLogs()
        {
            List<DataRow> liste = null;
            string query = "select  l.CD_CR, l.CD_JOB, t.CD_TRT, typ.CD_TYP_TRT, j.CD_TRT_SSIS, l.DT_DEB, l.DT_FIN, l.STATUT, l.PERIODE, t.CD_APPLI, case "
            + "when j.JR_EXEC < DAY(case when l.DT_DEB is null then DAY(l.DT_DEB) else day(l.DT_DEB) end) then 'EN_RETARD' "
            + "when j.JR_EXEC > DAY(l.DT_DEB) then 'A TEMPS' "
            + "else 'NON INITIE' end TIMING "
            + "from dbo.REF_TRT t, dbo.REF_TYP_TRT typ, dbo.REF_JOB j, dbo.LOGS l "
            + "where t.CD_TRT = j.CD_TRT and j.CD_TYP_TRT = typ.CD_TYP_TRT and l.CD_JOB = j.CD_JOB";
 
            string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand objCommand = new SqlCommand(query, conn))
                {
                    objCommand.CommandType = CommandType.Text;
                    DataTable dt = new DataTable();
                    SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                    conn.Open();
                    adp.Fill(dt);
                    if (dt != null)
                    {
                        liste = dt.AsEnumerable().ToList();
                    }
                }
            }
            return liste;
        }
    }
Si je ne récupère pas mes champs DateTime, ma requête me retourne les bons résultats, mais si je veux les récupérer, j'obtiens l'erreur indiquée au début de ce topic.

J'ai essayé de tester la valeur que me retourne le champ et si c'est "null", je lui retourne une valeur du genre "Pas de date" mais je ne sais pas où faire ce test ni la syntaxe qu'il doit avoir :/

Avez-vous une piste à me donner afin de résoudre ce soucis ?

Merci d'avance pour vos réponses