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 :

Problème au niveau de l'écriture sur la base de données


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut Problème au niveau de l'écriture sur la base de données
    Bonjour

    Dans le code suivant, je fais la recherche d'une valeur dans le champ sal1 de la table table_salaire et je la compare avec la valeur du textbox sal1.Text

    Lorsque je trouve la ligne en question, je change cette valeur par une autre valeur lue dans un autre textbox nouveau_sal.Text

    Au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDataAdapter.Update(MyDataset, "table_salaire")
    je recois le message suivant :
    Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information
    Avez-vous une idée ?

    Merci.
    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
    Dim Myconnexion As SqlConnection 
    Dim Mycommand As SqlCommand 
    Dim MyDataAdapter As SqlDataAdapter Dim MyDataset As New DataSet()
    Dim strSql As String 
    Dim MyDataTable As DataTable
    Dim MyDataRow As DataRow 
    Dim RowNumber As Integer = 0 
    Dim MyConnexionString As String
    Dim MyCommandBuilder As SqlCommandBuilder = Nothing 
    Try
    MyConnexionString = "Data Source=natahlie;Initial Catalog=Data_Base_salaire;Integrated Security=True"
    strSql = "SELECT sal1 FROM table_salaire" 
    Myconnexion = New SqlConnection 
    Myconnexion.ConnectionString = MyConnexionString
    Myconnexion.Open() 
    Mycommand = New SqlCommand(strSql) 
    MyDataAdapter = New SqlDataAdapter(Mycommand) 
    Mycommand.Connection() = Myconnexion 
    MyDataAdapter.Fill(MyDataset, "table_salaire") 
    MyDataTable = MyDataset.Tables("table_salaire") 
    RowNumber = MyDataTable.Rows.Count
    If MyDataTable.Rows.Count > 0 Then
    RowNumber = 0
    While RowNumber <= MyDataTable.Rows.Count - 1 
         MyDataRow = MyDataset.Tables("table_salaire").Rows(RowNumber)
      If MyDataRow("sal1") = sal1.Text Then
           MyDataRow("sal1") = nouveau_sal.Text 
           MyCommandBuilder = New SqlCommandBuilder(MyDataAdapter)   
           MyDataAdapter.Update(MyDataset, "table_salaire") 
           Exit While
        End If
       RowNumber = RowNumber + 1
    End While
    Else
      MessageBox.Show("pas de résultat pour les données", "Infos", _
      MessageBoxButtons.OK, MessageBoxIcon.Information)
    Exit Sub
    End If
    Catch ex As Exception
      MessageBox.Show(ex.Message)
    Finally
    If Not (Myconnexion Is Nothing) Then Myconnexion.Close()
    End Try

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    A priori, le problème vient du fait que la SelectCommand utilisée par le Fill() n'intègre pas la clé primaire de la table (seulement le champ "sal1)".

    Sinon, que contient MyAdapter.UpdateCommandt.CommandText après l'instruction "MyCommandBuilder = New SqlCommandBuilder(MyDataAdapter)" ?
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Graffito Voir le message
    A priori, le problème vient du fait que la SelectCommand utilisée par le Fill() n'intègre pas la clé primaire de la table (seulement le champ "sal1)".

    Sinon, que contient MyAdapter.UpdateCommandt.CommandText après l'instruction "MyCommandBuilder = New SqlCommandBuilder(MyDataAdapter)" ?
    J'ai rajouté la clé primaire "matricule" sans la manipuler dans le select comme suit mais ca donne la même chose.

    Code sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSql = "SELECT sal1, matricule FROM table_salaire"



    Lorsque j'essaye d'afficher la valeur de MyAdapter.UpdateCommandt.CommandText après l'instruction "MyCommandBuilder = New SqlCommandBuilder(MyDataAdapter)" ca me donne l'erreur suivante :
    Object reference not set to an instance of an object

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyDataRow.BeginEdit()
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyDataRow.EndEdit()
    comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    While RowNumber <= MyDataTable.Rows.Count - 1 
         MyDataRow = MyDataset.Tables("table_salaire").Rows(RowNumber)
     If MyDataRow("sal1") = sal1.Text Then
           MyDataRow.BeginEdit()
           MyDataRow("sal1") = nouveau_sal.Text 
           MyCommandBuilder = New SqlCommandBuilder(MyDataAdapter)   
           MyDataAdapter.Update(MyDataset, "table_salaire")
           MyDataRow.EndEdit()
        Exit While
        End If
      RowNumber = RowNumber + 1
    End While
    Maintenant il n'y a pas d'exception de levée, mais lorsque je vérifie la table sql, la nouvelle valeure n'a pas été mise à jour.

    Pouvez-vous vérifier mon code et voir s'il manque quelque choses ?

    j'ai vu des gens rajouter le bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyDataset.Clear()
    MyDataAdapter.Fill(MyDataset, "table_salaire")
    MyDataTable = MyDataset.Tables("table_salaire")
    est-il vraiment nécessaire de vider le dataset et le remplir de nouveau ?

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si MyAdapter.UpdateCommand n'est pas initialisée par le commandBuilder, impossible de faire un Update.
    En ce qui me concerne, j'utilise une bibliothèques de fonctions qui se substituent au CommandBuilder. Donc, je ne sais pas vraiment comment il synchronise la SelectCommand et l'Update Command qui sont nécessairement liées.

    sinon le code devrait être réarrangé ainsi (sans beginedit/endedit):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    While RowNumber <= MyDataTable.Rows.Count - 1 
         MyDataRow = MyDataset.Tables("table_salaire").Rows(RowNumber)
    If MyDataRow("sal1") = sal1.Text Then MyDataRow("sal1") = nouveau_sal.Text 
        Exit While
        End If
      RowNumber = RowNumber + 1
    End While
    MyDataAdapter.Update(MyDataset, "table_salaire") ;
    MyDataset.Tables("table_salaire").AcceptChanges() ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Si MyAdapter.UpdateCommand n'est pas initialisée par le commandBuilder, impossible de faire un Update.
    En ce qui me concerne, j'utilise une bibliothèques de fonctions qui se substituent au CommandBuilder. Donc, je ne sais pas vraiment comment il synchronise la SelectCommand et l'Update Command qui sont nécessairement liées.
    comment faire pour initialiser le MyAdapter.UpdateCommand par le commandBuilder ?

    Si c'est pas une propriété privé, j'aimerais bien bénéficier de cette bibliothéque

    Est-ce la meilleur méthode que je suis en train d'utiliser ? je me pose la question car je trouve que c'est un peu compliqué pour changer une valeur d'un champ. l'appel à une procédure stockée qui fait ce changement avec un énonçé update serait plus simple il me semble.

    sinon le code devrait être réarrangé ainsi (sans beginedit/endedit):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    While RowNumber <= MyDataTable.Rows.Count - 1 
         MyDataRow = MyDataset.Tables("table_salaire").Rows(RowNumber)
    If MyDataRow("sal1") = sal1.Text Then MyDataRow("sal1") = nouveau_sal.Text 
        Exit While
        End If
      RowNumber = RowNumber + 1
    End While
    MyDataAdapter.Update(MyDataset, "table_salaire") ;
    MyDataset.Tables("table_salaire").AcceptChanges() ;
    J'ai ajusté le code comme tu le mentionne ci-haut et je recois l'erreur suivante :
    Update requires a valid UpdateCommand when passed DataRow collection with modified rows.

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si c'est pas une propriété privé, j'aimerais bien bénéficier de cette bibliothéque
    Désolé, mais c'est développé dans ma boite, pas documenté et cette classe d'accès aux bases de données demande de nombreuses autres classes propriétaires.

    J'ai ajusté le code comme tu le mentionne ci-haut et je recois l'erreur suivante :
    Update requires a valid UpdateCommand when passed DataRow collection with modified rows.
    Il semblerait donc bien que le CommmandBuilder n'initialise pas la command Update , du fait que tu utilises une classe générique qui ne peut initialiser les UpdateCommand.

    Suivant la base de donnée, utiliser :
    - OleDbDataAdeptter et OleDbCommand pour Access,
    - OracleDbCommmand et OracleDb adapter pour Oracle,
    - MySqlDbDataAdeptter et MySqlDbCommand pour MySql,
    - ...
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/12/2012, 14h29
  2. Réponses: 3
    Dernier message: 04/11/2008, 14h13
  3. Mini Problème d'écriture dans la base de donnée
    Par DaisyVIP dans le forum ASP.NET
    Réponses: 9
    Dernier message: 29/05/2007, 14h52
  4. Récupération de la Date d'accés en écriture sur table/base
    Par gwenhael dans le forum Administration
    Réponses: 2
    Dernier message: 16/03/2007, 18h14
  5. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24

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