IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Requête sur un DateTime : Cannot cast DBNull. [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut Requête sur un DateTime : Cannot cast DBNull.
    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

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bon, mon collègue s'occupant de l'alimentation de la base de données et de la construction des requêtes a permis de résoudre mon problème avec une solution que j'avais envisagé mais que j'aimais pas trop.

    On a donc simplement rajouté un case dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    string query = "select  l.CD_CR, l.CD_JOB, t.CD_TRT, typ.CD_TYP_TRT, j.CD_TRT_SSIS, "
                + "case when(l.DT_DEB is null) then '01/01/1900' else l.DT_DEB end DT_DEB, case when(l.DT_FIN is null) then '01/01/1900' else l.DT_FIN end as 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";
    Quand on a "null" dans l'un des 2 champs de type DateTime, on renvoie simplement une date "bidon"...tout simplement :p

    Plus qu'à marquer ce sujet comme Résolu

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DateTime dateParDefaut = new DateTime(1900, 1, 1);
     
     
    ... DT_DEB = i.Field<DateTime?>("DT_DEB") ?? dateParDefaut ...
    Si DT_DEB est null, i.Field<DateTime?>("DT_DEB") va renvoyer null, et donc ça va prendre la valeur de l'autre côté du "??"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Requête SQL sur un datetime
    Par Genyuumaru dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 02/10/2012, 15h10
  2. Requête sur colonne DATETIME
    Par polon dans le forum Langage
    Réponses: 4
    Dernier message: 14/04/2009, 09h54
  3. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11
  4. Requête sur un serveur lié
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2003, 11h35
  5. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo