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 :

Impossible d'enregistrer un champs de type date comme Null dans une base sql server 2008 [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 143
    Points : 60
    Points
    60
    Par défaut Impossible d'enregistrer un champs de type date comme Null dans une base sql server 2008
    Bonjour,
    Dans mon projet, je souhaite enregistrer les données saisies sur mon formulaire dans une base sql server. Notons aussi qu'il existe des champs de type date dans ma base. Pour cela j'ai utilisé des masktexbox en leur donnant un format. Le problème c'est que lors de la saisie, quand je rempli tous les champs date, tout s'enregistre,mais quand je les laisse vide j'ai un message d'erreur
    Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.
    Voici le code qui me sert à enregistrer mes données
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    ' Déclaration de la variable cmd
            ' OleDbCommand représentera ici une instruction SQL à exécuter par rapport à une source de données
            Dim cmd As SqlCommand
            ' Déclaration de sql_ajouter, qui contiendra la requête SQL permettant d'ajouter un enregistrement
            Dim sql_ajouter As String
            'vérification 
            If Me.Nom.Text = "" Or _
               Me.Prenom.Text = "" Then
     
     
                MessageBox.Show("Vous devez remplir tous les champs !", "Erreur...", MessageBoxButtons.OK, MessageBoxIcon.Error)
     
                Matr_txt.Focus()
     
                Exit Sub
     
            End If
     
     
     
            ' On écrit notre requête et on l'assigne à la variable sql_ajouter
            sql_ajouter = "INSERT INTO Membre VALUES(@ID_Membre,@date_adhésion,@Nom,@Prenoms,@Date_naissance,@Habitation,@Sexe,@Pays,@Ville,@Langue_parlée,@Telephone,@Formation,@Celullaire,@Permis,@Nombre_enfant,@Type_membre,@Profession,@Statut_marital,@Departement,@Responsable,@Autre_departement,@photo)"
     
            ' Initialisation de la requête
            cmd = New SqlCommand(sql_ajouter, con)
     
            ' Ouverture de la connexion
     
            ' On définit les paramètres utilisés pour le bon déroulement de la requête
            ' On assigne à Val_Prenom" le texte contenu dans le textbox txt_ajouter_prenom
            cmd.Parameters.AddWithValue("@ID_Membre", Me.Matr_txt.Text)
            cmd.Parameters.AddWithValue("@date_adhésion", Me.Dat_adhtxt.Text)
     
            cmd.Parameters.AddWithValue("@Nom", Me.Nom.Text)
            cmd.Parameters.AddWithValue("@Prenoms", Me.Prenom.Text)
            cmd.Parameters.AddWithValue("@Date_naissance", Me.Dat_naisstxt.Text)
     
            cmd.Parameters.AddWithValue("@Habitation", Me.habit_txt.Text)
            cmd.Parameters.AddWithValue("@Sexe", Me.Sexe.Text)
            cmd.Parameters.AddWithValue("@Pays", Me.pays_txt.Text)
            cmd.Parameters.AddWithValue("@Ville", Me.ville_txt.Text)
            cmd.Parameters.AddWithValue("@Langue_parlée", Me.lang_parltxt.Text)
            cmd.Parameters.AddWithValue("@Telephone", Me.tel_txt.Text)
            cmd.Parameters.AddWithValue("@Formation", Me.formtxt.Text)
            cmd.Parameters.AddWithValue("@Celullaire", Me.cel_txt.Text)
            cmd.Parameters.AddWithValue("@Permis", Me.permitxt.Text)
            cmd.Parameters.AddWithValue("@Nombre_enfant", Me.nbr_enftxt.Text)
            cmd.Parameters.AddWithValue("@Type_membre", Me.typ_txt.Text)
            cmd.Parameters.AddWithValue("@Profession", Me.profess_txt.Text)
            cmd.Parameters.AddWithValue("@Statut_marital", Me.statmar_txt.Text)
            cmd.Parameters.AddWithValue("@Departement", Me.depart_txt.Text)
            cmd.Parameters.AddWithValue("@Responsable", Me.respo_txt.Text)
            cmd.Parameters.AddWithValue("@Autre_departement", Me.autrde_txt.Text)
     
            'gestion des photos
     
            Dim ms As New MemoryStream()
     
            PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
     
            Dim data As Byte() = ms.GetBuffer()
     
            Dim p As New SqlParameter("@photo", SqlDbType.Image)
     
            p.Value = data
     
            cmd.Parameters.Add(p)
     
            cmd.ExecuteNonQuery()
     
            MessageBox.Show("Membre enregistré avec succès!!", "Enregistré", MessageBoxButtons.OK)
     
            ' Ouverture de la connexion
     
            ' Exécution de la requête SQL
     
            ' Fermeture de la connexion
            cmd.Connection.Close()
     
     
            'fin essai
     
     
     
            'création et exécution du commandbuilder
            'pour mettre à jour le DataAdapter
            cmdb = New SqlCommandBuilder(dta)
     
            'mise à jour des données du DataAdapter
            'à partir du commandbuilder
            dta.Update(ds, "Membre")
     
            'on vide le dataset pour le recréer avec 
            'les nouvelles données 
            ds.Clear()
            dta.Fill(ds, "Membre")
            dtt = ds.Tables("Membre")
     
            'mise à jour de la datagrid
            DataGridView1.DataSource = ds.Tables("Membre")
            DataGridView1.Columns("photo").Visible = False
     
     
            'aller au début du fichier
            rownum = 0
     
            'affichage des données dans les texbox
            Me.Matr_txt.Text = dtt.Rows(rownum).Item("ID_Membre")
            Me.Dat_adhtxt.Text = dtt.Rows(rownum).Item("Date_adhésion")
            Me.Nom.Text = dtt.Rows(rownum).Item("Nom")
            Me.Prenom.Text = dtt.Rows(rownum).Item("Prenoms")
            Me.Dat_naisstxt.Text = dtt.Rows(rownum).Item("Date_naissance")
            Me.habit_txt.Text = dtt.Rows(rownum).Item("Habitation")
            Me.Sexe.Text = dtt.Rows(rownum).Item("Sexe")
            Me.pays_txt.Text = dtt.Rows(rownum).Item("Pays")
            Me.ville_txt.Text = dtt.Rows(rownum).Item("Ville")
            Me.lang_parltxt.Text = dtt.Rows(rownum).Item("Langue_parlée")
            Me.tel_txt.Text = dtt.Rows(rownum).Item("Telephone")
            Me.formtxt.Text = dtt.Rows(rownum).Item("Formation")
            Me.cel_txt.Text = dtt.Rows(rownum).Item("Celullaire")
            Me.permitxt.Text = dtt.Rows(rownum).Item("Permis")
            Me.profess_txt.Text = dtt.Rows(rownum).Item("Profession")
            Me.nbr_enftxt.Text = dtt.Rows(rownum).Item("Nombre_enfant")
            Me.typ_txt.Text = dtt.Rows(rownum).Item("Type_membre")
            Me.statmar_txt.Text = dtt.Rows(rownum).Item("Statut_marital")
            Me.depart_txt.Text = dtt.Rows(rownum).Item("Departement")
            Me.respo_txt.Text = dtt.Rows(rownum).Item("Responsable")
            Me.autrde_txt.Text = dtt.Rows(rownum).Item("Autre_departement")
            Dim c As Integer = ds.Tables("Membre").Rows.Count
            If c > 0 Then
                Dim bytBLOBData() As Byte = _
                                ds.Tables("Membre").Rows(0)("photo")
                Dim stmBLOBData As New MemoryStream(bytBLOBData)
                PictureBox1.Image = Image.FromStream(stmBLOBData)
            End If
     
            'activation des boutons
            cmd_premier.Enabled = True         'premier
            cmd_precedent.Enabled = True      'précédent
            cmd_suivant.Enabled = True       'suivant
            cmd_dernier.Enabled = True       'dernier
     
            cmd_modifier.Enabled = True
            cmd_supprimer.Enabled = True
            cmd_fermer.Enabled = True
     
            cmd_nouveau.Enabled = True
            cmd_enregistrer.Enabled = False      'valider
     
            cmd_nouveau.Text = "Nouveau"
        End Sub
    Merci d'avance

  2. #2
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut
    Salut,
    cest normal car dans ta requete insert tu appel les champs dates donc il attent des valeurs.
    En premier je te dirais de mettre une valeur par defaut dans tes masktexbox ou alors tu crées des requetes sans appele les champs dates.
    Lorsque le sage montre la lune du doigt l'idiot regarde le doigt.

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 206
    Points : 28 129
    Points
    28 129
    Par défaut
    Suite à discussion sur le chat...

    Concernant le problème des textbox vides, il faut tester si la textbox est remplie. Si elle est vide, il faut passer Nothing comme paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		If Me.Prenom.Text = String.Empty Then
    			cmd.Parameters.AddWithValue("@Prenoms", Nothing)
    		Else
    			cmd.Parameters.AddWithValue("@Prenoms", Me.Prenom.Text)
    		End If
    qui doit pouvoir être écrit de façon condensée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.AddWithValue("@Prenoms", if(Me.Prenom.Text=String.Empty,Nothing,Me.Prenom.Text))

    Concernant le problème des Dates, il y a 2 problèmes, le cas des "textbox" vides et le format de passage de la date dans la requete.
    Ici c'est des MaskTextbox qui sont utilisées. Apparemment lorsque elles ne sont pas renseignées, elles ne sont quand même pas vides, elles renvoient "//" (en fonction du masque choisi). Il ne faudrait donc pas faire le test sur String.Empty, mais plutôt sur cette valeur par défaut.
    Concernant le passage de la valeur, le plus simple, pour s'affranchir des différents formats de conversion, étant de passer directement un format DateTime au paramètre. Dans ce cas, il faut donc convertir la valeur de la MaskTextBox en DateTime, et savoir d'abord si la valeur saisie peut être convertie.
    Donc dans le même principe que tout à l'heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		If Not IsDate(Me.Dat_naisstxt.Text) Then
    			cmd.Parameters.AddWithValue("@Date_naissance", Nothing)
    		Else
    			cmd.Parameters.AddWithValue("@Date_naissance", DateTime.Parse(Me.Dat_naisstxt.Text))
    		End If
    version condensée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.AddWithValue("@Date_naissance", if(IsDate(Me.Dat_naisstxt.Text),DateTime.Parse(Me.Dat_naisstxt.Text),Nothing)

    Une autre solution pour les dates est l'utilisation de DateTimePicker à la place des MaskTextBox. Le DateTimePicker renvoie toujours une date valide, on peut donc utiliser directement la valeur dans la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.Parameters.AddWithValue("@Date_naissance", DateTimePicker1.Value)
    Problème : Le DateTimePicker renvoie toujours une date valide. Il n'existe pas de notion "pas saisie".
    Pour contourner le problème, il est possible d'initialiser le contrôle à une date précise et connue, au lancement de l'écran par exemple (par défaut, il s'initialise à la date du jour) et ensuite, au moment de créer le paramètre de la requete, vérifier si la valeur est à la date initiale (donc pas saisi), dans ce cas, on crée le paramètre avec Nothing, ou à une date différente de la date initiale (donc a été modifié), dans ce cas, on crée le paramètre avec cette valeur.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci pour les réponses,
    Voilà j'ai opté pour le choix portant sur la vérification des données entrées dans les masktextbox.Après modification avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If Not IsDate(Me.Dat_naisstxt.Text) Then
                cmd.Parameters.AddWithValue("@Date_naissance", Nothing)
            Else
                cmd.Parameters.AddWithValue("@Date_naissance", DateTime.Parse(Me.Dat_naisstxt.Text))
            End If
    J'ai ce message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.ExecuteNonQuery() '........ici   La requête paramétrée '(@ID_Membre nvarchar(1),@Date_adhésion datetime,@Nom nvarchar(7)' attend le paramètre @Date_naissance, qui n'a pas été fourni.
    Merci d'avance

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 206
    Points : 28 129
    Points
    28 129
    Par défaut
    Erreur de ma part, Il afut remplacer les Nothing par DbNull.Value.

    Nothing n'est pas connu par les moteurs SQL.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci car c'est résolu.

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

Discussions similaires

  1. [Débutant] Enregistrer des données dans une base sql server CE
    Par hugnka dans le forum VB.NET
    Réponses: 11
    Dernier message: 18/12/2012, 15h47
  2. Réponses: 4
    Dernier message: 22/12/2011, 16h54
  3. inserer une date en ASP dans une base ACCESS
    Par link39001 dans le forum ASP
    Réponses: 7
    Dernier message: 17/05/2006, 13h13
  4. Réponses: 5
    Dernier message: 10/05/2006, 15h47
  5. changer le type d'un attribut dans une base oracle 8i
    Par vrossi59 dans le forum Oracle
    Réponses: 3
    Dernier message: 24/02/2006, 15h28

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