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

VB.NET Discussion :

DateTime.MinValue avec Base Acces et Datagridview


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Par défaut DateTime.MinValue avec Base Acces et Datagridview
    Bonjour à tous,

    Voilà tout est dans le titre .....

    J'ai un Datagridview qui est alimenté par une base access. Pour insérer les données, j'utilise un form.
    Dans cette saisie, j'ai un champ Dateprévue qui est composé d'une date et heure au format : 02/05/2016 14h00

    Afin de pouvoir classer cette colonne, je n'ai pas d'autre choix que de définir cette colonne comme une date....
    Dans ma base access, c'est ce que j'ai fait. Idem dans ma colonne Datagridview.

    Le soucis est qu'au début ce champs de saisi peut être vide, sans date. Et c'est là que le DateTime.MinValue vient semer la zizanie
    Dans ce cas :
    - Dans le Datagridview, s'affiche une date du style 01/01/0001 00h00
    - Dans la Base Access s'affiche une date du style 31/12/1899 23h59

    J'ai lu pleins de choses et un champ date-heure ne peut pas être laissé vide. J'ai lu qu'on peut définir la valeur null mais j'ai pas réussis.
    Dès que je lance le programme, dans mon tableau, il me met la fameuse DateTime.MinValue ....
    Dès que je fais une nouvelle entrée sans mettre de date, j'ai cette DateTime.MinValue qui se met dans le Datagridview et Base Access....

    Ce que je souhaiterais vraiment est que si l'utilisateur ne saisit aucune date alors dans mon datagridview + base access, çà reste vide et que rien ne s'affiche.
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Re IL-MAFIOSO

    Pas sur que je sois d'une grande aide pour ce problème, je bénis le grand créateur de ne jamais m'avoir donné à travailler avec une base access.
    Cependant il faudrait savoir comment tu réalises ta mise a jour déjà ? C'est toi qui a écrit l'insert ? ou si tu as tout bindé de bout en bout et dans ce cas la mise a jour (l'insert dans notre cas) et géré par le framework (j'ai jamais fait ça mais je crois que c'est possible)
    Si c'est toi qui a écrit l'insert on pourra peut être s'en sortir, sinon je ne saurais quoi te dire...

    Est-ce que ton date dans access accepte les valeur null ?
    Est-ce que tu as une classe qui représente ce que tu veux insérer en bdd ? Si oui dans ce cas ta classe dois avoir une propriété DateTime, et c'est donc cette propriété que tu voudrais mettre à null, dans ce cas tu peux la rendre 'Nullable' en la déclarant ainsi :

    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
    
    Dim myDateNullable As DateTime?
    
    myDateNullable   = Nothing
    
    myDateNullable   = DateTime.Now
    
    if(myDateNullable.HasValue())
    {
    'j'ai une date
    }
    else
    {
    'la date est null
    }
    J@ck.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Par défaut
    Re,

    Alors pour situer le décors et essayer de répondre à tes questions

    J'utilise une base access qui alimente mon datagridview et vice-versa (Bindingsource-DataTable-....)
    Pour la colonne en question, je la formate en datetime et autorise les null.
    Pour la colonne du datagridview, je le formate en datetime aussi

    Pour l'insertion d'une nouvelle entrée, j'utilise un form qui après validation insère les données par la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.Table1bindingSource.DataSource.Rows.Add(New Object() {.......})
    Pour modifier l'entrée, j'édite la ligne et valide les modification par la mise à jour du Table1datagridview et à la fin, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form1.Table1bindingSource.EndEdit()
    Form1.Table1dataAdapter.Update(Ctype(Form1.Table1bindingSource.DataSource, DataTable))
    Form1.Table1.AcceptChanges()

    Dans ces données j'ai deux textbox : 1 pour la date et l'autre pour l'heure. Ces deux contrôles font ma variable depart sous la forme 24/03/2016 15:00 (J'ai des contrôles qui s'assurent que tout est au bon format)
    il arrive souvent qu'au début, il n'y ai rien d'inscrit dans ces deux champs. Quand je lance l'insertion, je retrouve dans la BDD pour cette colonne la fameuse DateTime.Minvalue et dans le datagridview apparait alors le fameux 01.01.0001 00h00

    Ce qui marche est que quand j'édite ma ligne, mes deux textbox restent vides car je pense que le système sait que cette valeur est celle de "remplacement" pour rien.
    Mais cette valeur apparait dans la colonne concernée du Datagridview et dans la base access j'ai une date du style 31/12/1899 23h59 qui doit être la MinValue pour access je suppose.
    Lorsque j'ai changé la colonne dans access de texte en DateTime, je n'ai eu aucun message particulier malgré le fait que pour plusieurs lignes de la base, la colonne concernée était vide.

    J'ai ausssi essayé ce petit bout de code de débutant pour faire un test avant de valider une nouvelle entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim departprevu as DateTime
    If isDate(depart) then
    departprevu = DateTime.Parse(depart)
    else
    departprevu = Nothing
    end if
    Il me met quand même ces DateTime.MinValue dans la base access et Datagridview.
    Si j'enlève le format DateTime de ma colonne dans le Datagridview, il ne me l'affiche plus malgré que dans la base access, j'ai cette valeur. Mais je ne peux plus alors trier ma colonne par ordre chronologique car il va trier la colonne comme du simple texte par ordre alphabétique ....

    Voilà, j'espère avoir été assez clair pour toi.

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Vu que tout est fait de bout en bout par le binding et donc le type DateTime est utilisé, et le fait que ce type n'est pas nullable, je suis pas sur qu'on va y arriver directement, par exemple même si on envoi null comme valeur dans la datagridview vu que la colonne est en DateTime, une valeur sera affiché (surement DateTime.MinValue) il faudrait faire le test.

    Cependant, il faudrait que tu debug ton appli et lire la valeur de departprevu après l’exécution de
    Je pense que dans ce cas departprevu vaudra DateTime.MinValue, car je me suis rendu compte à la lecture de ce post que Nothing en VB ne veut pas dire mettre à null mais donner la valeur par défaut.... ce qui change tout pour un type non nullable.

    Et du coup il faudrait tester avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim departprevu as DateTime?
    If isDate(depart) then
    departprevu = DateTime.Parse(depart)
    else
    departprevu =  CType(Nothing, DateTime?)
    end if
    Attention le type est bien >> DateTime? << il faut le ?

    et du coup departprevu vaudra bien null dans ce cas, après comme je le dis plus haut je pense que la valeur afficher dans la datagridview sera toujour DateTime.MinValue ... on verra, mais dans ce cas on pourra tester la valeur et modifier l'affichage dans la datagridview.

    J@ck.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Par défaut
    Hello,

    Pour :
    Il me donne 00:00:00

    Dans le Datagridview, apparait : 01/01/0001 00:00
    Dans Access : 30/12/1899 00:00

    J'ai essayé avec ton bout de code et çà à l'air OK.
    J'ai donc remis ce bout de code dans le cadre d'une modification. Là c'est le Datagridview qui n'aime pas :
    System.ArgumentException: impossible de définir Column 'Departprevu' à null.Utilisez DBnull à la place.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Ok mes théories étaient donc fondées.

    Et tu a essayé de mettre DBNull ?
    Il te faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     departprevu = CType(Nothing, DateTime?)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    departprevu = Convert.DBNull
    Je me dis que ça doit surement être ta solution

    J@ck.

Discussions similaires

  1. base de données externe avec MySQL: accès Natif
    Par dotocosme dans le forum HyperFileSQL
    Réponses: 10
    Dernier message: 27/12/2010, 23h51
  2. Remplissage DatagridView avec Base Oracle
    Par Sharp93 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 23/06/2009, 10h00
  3. [Portlet] portlet avec un accès à une base de donné mysql
    Par prodit96 dans le forum Portails
    Réponses: 1
    Dernier message: 12/01/2009, 15h41
  4. datagridview lenteur avec base de donne
    Par Julien666 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/01/2008, 10h55
  5. Ouverture d'une base Acces avec Builder 6 pro
    Par tryonyco dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/08/2005, 15h45

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