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

Windows Forms Discussion :

[VB.NET 2003] problème de MAJ d'une DB


Sujet :

Windows Forms

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut [VB.NET 2003] problème de MAJ d'une DB
    Bonjour,

    Avant de rentrer dans le vif du sujet avec le code, une brève explication. Je suis en train de créer une application pour faire du CRM sur des commandes de chèques cadeau. J'ai créé un module de gestion de la DB en m'inspirant sur le cours de Philippe Laserre.

    J'ai, pour le cas qui m'occupe ici, une table "commande" dont les champs sont :
    • NIDCOMM (numeric) : id commande
    • NIDCLIENT (numeric) : id client
    • DDATE (date) : date commande
    • CMODECOMM (char) : mode de commande
    • CCONTACT (char) : personne de contact
    • NACOMM (numeric) : montant total de la commande
    • CCOMMENT (char) : commentaires
    • CADRLIVR (char) : adresse de livraison
    • CZIPLIVR (char) : code postal
    • CLOCLIVR (char) : localité
    • DDATECR (date) : date de création du record
    • DDATEMD (date) : date de modification du record
    • CUSERCR (char) : user qui crée le record
    • CUSERMD (char) : user qui modifie le record


    Et une table "cheque" dont les champs sont :
    • NIDCOMM (numeric) : id commnade
    • NMONTANT (numeric) : montant du/des chèques
    • NNOMBRE (numeric) : nombre de chèques
    • DDATECR, DDATEMD, CUSERCR, CUSERMD : idem que table précédente


    Voici le code que j'ai produit...

    Mon module de gestion de la DB :
    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
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    Module dm
        Dim conn As New Advantage.Data.Provider.AdsConnection
        Dim cmd As New Advantage.Data.Provider.AdsCommand
        Dim da As New Advantage.Data.Provider.AdsDataAdapter
        Dim ds As New DataSet
        Dim cb As Advantage.Data.Provider.AdsCommandBuilder
     
        Public Sub DoConnect()
            conn.ConnectionString = "Data Source = C:\.NET Projet\CRM\DBF\; TableType = CDX; ServerType = LOCAL"
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If
            cmd.Connection = conn
        End Sub
     
        Public Sub DoDisconnect()
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Sub
     
        Public Function DoSelect(ByVal table As ArrayList, ByVal fields As ArrayList, ByVal criterias As ArrayList, ByVal distinct As Boolean, ByVal order As ArrayList) As DataSet
            'each item of fields must be structured like "tableName.fieldName"
            'criterias must be structured like this : <key,value> where key is the fieldname and the operator
            'example : < "client.NIDCLIENT" = ; 0 > or < "contact.CNOM" = ; "arnaud" >
            Dim sql As String
     
            Try
                If distinct Then
                    sql = "select distinct "
                Else
                    sql = "select "
                End If
     
                If Not (fields Is Nothing) Then
                    For Each elem As String In fields
                        sql = sql + elem + ", "
                    Next
                Else
                    sql = sql + "* "
                End If
     
     
                sql = sql.TrimEnd(", ".ToCharArray) + " from "
     
                For Each elem As String In table
                    sql = sql + elem + ", "
                Next
     
                sql = sql.TrimEnd(", ".ToCharArray) + " where "
     
                If Not (criterias Is Nothing) Then
                    For Each elem As String In criterias
                        sql = sql + elem + " and "
                    Next
                    If sql.EndsWith(" and ") Then
                        sql = sql.Substring(0, sql.Length - 5)
                    End If
                End If
     
                If sql.EndsWith(" where ") Then
                    sql = sql.Substring(0, sql.Length - 7)
                End If
     
                If Not (order Is Nothing) Then
                    sql = sql + " order by "
                    For Each elem As String In order
                        sql = sql + elem + ","
                    Next
                    sql = sql.TrimEnd(",")
                    If sql.EndsWith(" order by ") Then
                        sql = sql.Substring(0, sql.Length - 10)
                    End If
                End If
     
                cmd.CommandText = sql
                da.SelectCommand = cmd
                ds.Reset()
                da.Fill(ds)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
     
            Return ds
        End Function
     
        Public Function DoDelete(ByVal ds As DataSet) As Boolean
            Try
                For Each row As DataRow In ds.Tables(0).Rows
                    row.Delete()
                Next
                cb = New Advantage.Data.Provider.AdsCommandBuilder(da)
                cb.RequirePrimaryKey = False
                da.Update(ds)
                ds.Reset()
                da.Fill(ds)
                cb.Dispose()
                Return True
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try
        End Function
     
        Public Function DoAdd(ByVal values As Hashtable, ByVal table As String) As Boolean
            Dim newrow As DataRow
            Dim keys As IEnumerator
            'Dim retour As New Hashtable
     
            Try
                Dim tables As New ArrayList
                tables.Add(table)
                ds.Reset()
                ds = DoSelect(tables, Nothing, Nothing, False, Nothing)
                tables.Clear()
                newrow = ds.Tables(0).NewRow
                keys = values.Keys.GetEnumerator
                While keys.MoveNext
                    newrow.Item(keys.Current) = values(keys.Current)
                End While
                values.Clear()
                ds.Tables(0).Rows.Add(newrow)
                cb = New Advantage.Data.Provider.AdsCommandBuilder(da)
                cb.RequirePrimaryKey = False
                da.Update(ds)
                ds.Reset()
                da.Fill(ds)
                cb.Dispose()
                Return True
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try
        End Function
     
        Public Function DoFastUpdate(ByRef ds As DataSet) As DataSet
            'pour des updates en éditant directement dans la datagrid
            Try
                cb = New Advantage.Data.Provider.AdsCommandBuilder(da)
                cb.RequirePrimaryKey = False
                da.Update(ds)
                ds.Reset()
                da.Fill(ds)
                cb.Dispose()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Return ds
        End Function
     
        Public Function DoUpdate(ByVal values As Hashtable, ByVal table As String, ByVal criterias As ArrayList) As Boolean
            Dim currRow As DataRow
            Dim keys As IEnumerator
            Dim tables As New ArrayList
            Try
                tables.Add(table)
                ds.Reset()
                ds = DoSelect(tables, Nothing, criterias, False, Nothing)
                tables.Clear()
                currRow = ds.Tables(0).Rows(0)
                keys = values.Keys.GetEnumerator
                While keys.MoveNext
                    currRow.Item(keys.Current) = values(keys.Current)
                End While
                values.Clear()
                cb = New Advantage.Data.Provider.AdsCommandBuilder(da)
                cb.RequirePrimaryKey = False
                da.Update(ds.Tables(0))
                ds.Reset()
                da.Fill(ds)
                cb.Dispose()
                Return True
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try
        End Function
    End Module
    La procedure qui est enregistre la commande et les chèques qui vont avec :
    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
        Private Sub btnRec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRec.Click
            Dim bOk As Boolean = True
            For Each control As Control In Me.Controls
                If TypeOf (control) Is ComboBox And control.Text = "" Then
                    bOk = False
                End If
                If TypeOf (control) Is TextBox And control.Text = "" And (control.Name <> "tbComment" And control.Name <> "tbCheque" And control.Name <> "tbMontant") Then
                    bOk = False
                End If
            Next
            If lvCheque.Items.Count = 0 Then
                bOk = False
            End If
            If bOk Then
                values.Add("nidcomm", tbIdComm.Text)
                values.Add("nidclient", cbIdClient.Text)
                values.Add("ddate", dtpDate.Value.ToString)
                values.Add("cmodecomm", cbModeComm.Text)
                values.Add("ccontact", cbContact.Text)
                values.Add("nacomm", tbTotal.Text)
                values.Add("cadrlivr", tbAdrLivr.Text)
                values.Add("cziplivr", tbZipLivr.Text)
                values.Add("cloclivr", tbLoclivr.Text)
                values.Add("ccomment", tbComment.Text)
                If bNew Then
                    values.Add("ddatecr", Today.Date)
                    values.Add("ddatemd", DBNull.Value)
                    values.Add("cusercr", Environment.UserName)
                    values.Add("cusermd", DBNull.Value)
                    If dm.DoAdd(values, "commande") Then
                        values.Clear()
                        For Each elem As ListViewItem In lvCheque.Items
                            values.Add("nidcomm", tbIdComm.Text)
                            values.Add("nmontant", elem.SubItems(0).Text)
                            values.Add("nnombre", elem.SubItems(1).Text)
                            values.Add("ddatecr", Today.Date)
                            values.Add("ddatemd", DBNull.Value)
                            values.Add("cusercr", Environment.UserName)
                            values.Add("cusermd", DBNull.Value)
                            dm.DoAdd(values, "cheque")
                            values.Clear()
                        Next
                    End If
                Else
                    values.Add("ddatecr", currRow.Item("ddatecr"))
                    values.Add("ddatemd", Today.Date)
                    values.Add("cusercr", currRow.Item("cusercr"))
                    values.Add("cusermd", Environment.UserName)
                    criterias.Add("nidcomm = " + idComm.ToString)
                    If dm.DoUpdate(values, "commande", criterias) Then
                        criterias.Clear()
                        values.Clear()
                        tables.Add("cheque")
                        criterias.Add("nidcomm = " + idComm.ToString)
                        ds.Reset()
                        ds = dm.DoSelect(tables, Nothing, criterias, False, Nothing)
                        criterias.Clear()
                        If dm.DoDelete(ds) Then
                            For Each elem As ListViewItem In lvCheque.Items
                                values.Add("nidcomm", tbIdComm.Text)
                                values.Add("nmontant", elem.SubItems(0).Text)
                                values.Add("nnombre", elem.SubItems(1).Text)
                                values.Add("ddatecr", currRow.Item("ddatecr"))
                                values.Add("ddatemd", Today.Date)
                                values.Add("cusercr", currRow.Item("cusercr"))
                                values.Add("cusermd", Environment.UserName)
                                ds.Reset()
                                dm.DoAdd(values, "cheque")
                                values.Clear()
                            Next
                        End If
                    Else
                        criterias.Clear()
                        values.Clear()
                    End If
                End If
     
            Else
                MsgBox("Tous les champs de ce formulaire, à l'exception des commentaires, sont obligatoires." + Chr(13) + "Veuillez les compléter", MsgBoxStyle.OKOnly, "Erreur")
            End If
        End Sub
    Mon problème se situe lors d'ajout d'enregistrement dans la table "cheque". La commande s'enregistre sans aucun problème mais lorsque vient le moment d'ajouter un chèque, la ligne "da.Update(ds)" dans la fonction DoAdd dans mon module de gestion génère une exception dont le message est :
    Column "NIDCLIENT" does not belong to table Table"
    J'ai déjà vérifié ma variable newRow et elle ne contient pas de champs nommé NIDCLIENT. Cela doit être un reste de la requête d'ajout précédente mais comment faire pour m'en débarrasser ?

    Merci d'avance.

    Griftou.

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bon et bien j'ai résolu le problème en faisant le new de mon DataAdapter au début de la fonction DoSelect de mon DataModule et en faisant un dispose de mon DataAdapter après chaque mise à jour.

    Donc ça marche mais si quelqu'un pouvait m'expliquer pourquoi ça marche, ce serait sympa

Discussions similaires

  1. [Visual Studio .Net 2003]Problème d'édition de liens
    Par Mindiell dans le forum Visual C++
    Réponses: 10
    Dernier message: 25/05/2007, 23h43
  2. [VC++.net 2003] Problème de cast
    Par Rafoo dans le forum Visual C++
    Réponses: 6
    Dernier message: 20/09/2006, 09h14
  3. Réponses: 2
    Dernier message: 05/05/2006, 15h10
  4. Problème de MAJ d'une zone de liste
    Par Jérémy VAUTIER dans le forum Access
    Réponses: 3
    Dernier message: 17/10/2005, 14h09
  5. [IDE][VS.NET 2003] Y a-t-il une liste des racourcis ?
    Par 404Found dans le forum Contribuez
    Réponses: 2
    Dernier message: 22/06/2004, 20h20

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