none
Mise à jour enregistrement dans DB ACCESS RRS feed

  • Question

  • Bonjour à tous,

    Jusqu'à présent mon code fonctionnait sans problème...
    Je dois enregistrer une commande.
    Lorsqu'il n'y a pas de numéro de bordereau, j'affecte la valeur de l'index (numéro automatique dans la table) au numéro de bordereau.

    Voila comment je procède,
    J'enregistre la commande avec un numéro temporaire
    //identifiant temporaire
    l_NumB = string.Format("{0}{1}", new object[] { System.Environment.UserName, CeJour.Ticks });
    l_RowCmde.NUMBORDEREAU = l_NumB;
    l_Adapt.Update(l_TblCmde);

    Je recharge la commande et je récupère l'index de la commande
    l_RowCmde = (DELdb.FijaCmde.CommandeRow)l_TblCmde.Rows[0];
    m_Affaire.ID = l_RowCmde.INDEX;

    je modifie le champ
    l_RowCmde.NUMBORDEREAU = m_Affaire.ID.ToString();

    Je fais la mise à jour
    l_Adapt.Update(l_TblCmde);

    Jusqu'à présent cela fonctionnait très bien.
    Maintenant j'ai une exception:
    Violation de l'accès concurrentiel : UpdateCommand a affecté 0 des enregistrements 1 attendus.

    Comme j'ai modifié la table commande entre temps, je l'ai supprimée du DataSet(xsd) et je l'ai remise.
    J'ai vérifié que je récupère bien les champs avec leur caractéristiques à jour.

    Voici le code
    //La date du jour
    DateTime CeJour = DateTime.UtcNow.ToLocalTime();

    CommandeDataTable l_TblCmde = new CommandeDataTable();
    CommandeTableAdapter l_Adapt = new CommandeTableAdapter();
    string l_Sql =
     "  SELECT [INDEX], NUMBORDEREAU, DATECOMMANDE, NUMCLIENT, CLIENT, GROUPEMENT, IDTYPECOMMANDE, " +
     "  IDSOURCE  FROM Commande where (NUMBORDEREAU='" + m_Affaire.LstInfos[RSCE.NUMBORDEREAU] + "') ";

    l_Adapt.setSql(l_Sql);
    l_Adapt.Fill(l_TblCmde);

    CommandeRow l_RowCmde = l_TblCmde.NewCommandeRow();

    //Remplissage des champs...
    l_RowCmde.NUMCLIENT = m_Affaire.LstInfos[RSCE.NUMCLIENT];
    l_RowCmde.CLIENT = m_Affaire.LstInfos[RSCE.CLIENT];
    l_RowCmde.CMDENREGISTRERLE = new DateTime(CeJour.Year, CeJour.Month, CeJour.Day, 0, 0, 0);

    //identifiant temporaire
    l_NumB = string.Format("{0}{1}", new object[] { System.Environment.UserName, CeJour.Ticks });

    l_RowCmde.NUMBORDEREAU = l_NumB;

    l_TblCmde.AddCommandeRow(l_RowCmde);
    l_Adapt.Update(l_TblCmde);

    l_TblCmde.clear();

    l_Sql =
     "  SELECT [INDEX], NUMBORDEREAU, DATECOMMANDE, NUMCLIENT, CLIENT, GROUPEMENT, IDTYPECOMMANDE, " +
     "  IDSOURCE  FROM Commande where (NUMBORDEREAU='" + l_NumB + "') ";

    l_Adapt.setSql(l_Sql);
    l_Adapt.Fill(l_TblCmde);


    l_RowCmde = (DELdb.FijaCmde.CommandeRow)l_TblCmde.Rows[0];
    m_Affaire.ID = l_RowCmde.INDEX;
    l_RowCmde.NUMBORDEREAU = m_Affaire.ID.ToString();

    //Exception lors de l'update...

    l_Adapt.Update(l_TblCmde);


    Violation de l'accès concurrentiel : UpdateCommand a affecté 0 des enregistrements 1 attendus.


     à System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       à System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       à System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
       à System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
       à System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
       à DELdb.FijaCmdeTableAdapters.CommandeTableAdapter.Update(CommandeDataTable dataTable) dans C:\DelSources\DELdb\FijaCmde.Designer.cs:ligne 7149
       à FIJAcommande.DBcommande.enregistrerCmde() dans C:\DelSources\FIJAcommande\FIJAcommande\DBcommande.cs:ligne 314
       à FIJAcommande.DBcommande.EnregistrerCMDE() dans C:\DelSources\FIJAcommande\FIJAcommande\DBcommande.cs:ligne 37
       à FIJAcommande.Form1.MNUenregistrer_Click(Object sender, EventArgs e) dans C:\DelSources\FIJAcommande\FIJAcommande\Form1.cs:ligne 932

    jeudi 30 juillet 2015 09:10

Réponses

  • Il y a discordance entre la table et la requête.
    J'ai ajouté un champ dans la table et je n'avais pas modifié la requête dans mon code.
    Nouvelle requête: j'ai ajouté le champ ENREGISTRERLE et tout fonctionne.
    SELECT INDEXARTICLE, IDCOMMANDE, IDARTICLE, NUMGROUPE, IDPRODUIT, DATELIVRAISON, DESCRIPTION, REFCLIENT, REFERENCECLIENT, STATUT, ENREGISTRERLE FROM Articles where (IDARTICLE='{0}')

    • Marqué comme réponse GP79 jeudi 30 juillet 2015 14:24
    jeudi 30 juillet 2015 14:24