////////////////////////////////////////////////////////////////////////////////////
        private void AssureDonnees()
        {
            if (m_bLoaded)
            {
                return;
            }
            IObjetServeur loader  = ((CContexteDonnee)m_row.Table.DataSet).GetTableLoader(m_row.Table.TableName);
            CFiltreData   filtre  = CFiltreData.CreateFiltreAndSurRow(m_row.Table.PrimaryKey, m_row);
            ArrayList     lstKeys = new ArrayList();

            foreach (DataColumn col in m_row.Table.PrimaryKey)
            {
                lstKeys.Add(m_row[col]);
            }
            CResultAErreur result = loader.ReadBlob(m_strChamp, lstKeys.ToArray());

            if (!result)
            {
                throw new CExceptionErreur(result.Erreur);
            }
            m_donnees = (byte[])result.Data;
            if (m_donnees != null)
            {
                m_donneesOriginales = (byte[])m_donnees.Clone();
            }
            else
            {
                m_donneesOriginales = null;
            }
            m_bLoaded = true;
        }
        //-----------------------------------------------------------------------
        //////////////////////////////////////////////////
        public static bool IsUnique(CObjetDonnee objet, string strChamp, string strValeurChamp)
        {
            if (objet == null)
            {
                return(true);
            }
            CFiltreData filtre = CFiltreData.CreateFiltreAndSurRow(objet.GetChampsId(), objet.Row);

            filtre.Filtre = strChamp + " like @" + (filtre.Parametres.Count + 1) + " and not(" + filtre.Filtre + ")";
            filtre.Parametres.Add(strValeurChamp);
            CListeObjetsDonnees liste = new CListeObjetsDonnees(objet.ContexteDonnee, objet.GetType());

            liste.Filtre = filtre;
            if (liste.CountNoLoad != 0)
            {
                return(false);
            }
            return(true);
        }
Exemple #3
0
        /// ////////////////////////////////////////////////////////////////////////
        public static void Merge(DataTable tableSource, DataSet dsDest, bool bPreseveChanges)
        {
            DataTable tableDest = dsDest.Tables[tableSource.TableName];

            if (tableDest == null)
            {
                //Création de la table
                tableDest = AddTableCopie(tableSource, dsDest);
            }
            bool bOldEnforce = dsDest.EnforceConstraints;

            if (tableSource.Rows.Count == 0)
            {
                return;
            }
            DataColumn[] keys    = tableSource.PrimaryKey;
            int          nNbKeys = tableSource.PrimaryKey.Length;

            Hashtable tableSupprimees = null;

            //Si une seule clé, stocke la liste des supprimées dans une hashtable
            //pour un recherche plus rapide
            if (nNbKeys == 1 && bPreseveChanges)
            {
                tableSupprimees = new Hashtable();
                DataRow[] rows = tableDest.Select("", "", DataViewRowState.Deleted);
                foreach (DataRow row in rows)
                {
                    tableSupprimees[row[keys[0].ColumnName, DataRowVersion.Original]] = true;
                }
            }


            dsDest.EnforceConstraints = false;
            DataColumn colIsToRead = tableDest.Columns[CContexteDonnee.c_colIsToRead];

            try
            {
                foreach (DataRow row in tableSource.Rows)
                {
                    try
                    {
                        DataRowVersion version = DataRowVersion.Default;
                        if (row.RowState == DataRowState.Deleted)
                        {
                            version = DataRowVersion.Original;
                        }
                        object[] cles = new object[nNbKeys];
                        for (int n = 0; n < nNbKeys; n++)
                        {
                            cles[n] = row[keys[n], version];
                        }

                        //Tente d'abord le lien sur la clé primaire
                        DataRow rowDest = tableDest.Rows.Find(cles);
                        if (rowDest != null)
                        {
                            bool bShouldUpdate = (rowDest.RowState & (DataRowState.Modified | DataRowState.Added | DataRowState.Deleted)) == 0;
                            if (bPreseveChanges && colIsToRead != null)
                            {
                                bShouldUpdate = (bool)rowDest[colIsToRead];
                            }
                            if (bShouldUpdate)
                            {
                                if (row.RowState == DataRowState.Deleted && rowDest.RowState != DataRowState.Deleted)
                                {
                                    rowDest.Delete();
                                }
                                else
                                {
                                    if (dsDest is CContexteDonnee)
                                    {
                                        ((CContexteDonnee)dsDest).CopyRow(row, rowDest, DataRowVersion.Current, true);
                                    }
                                    else
                                    {
                                        CopyRow(row, rowDest, DataRowVersion.Current, true);
                                    }
                                }
                            }
                        }
                        //Si la ligne existe dans le contexte de destination mais
                        //qu'elle a été supprimée, Find ne la trouve pas, il faut donc
                        //Vérifier si elle n'est pas là autrement
                        else
                        {
                            bool bShouldImporte = true;
                            if (bPreseveChanges)                              //On n'importe pas les lignes supprimées
                            //si on conserve les modifs faites dans la destination
                            {
                                if (tableSupprimees != null)
                                {
                                    if (tableSupprimees.Contains(row[keys[0]]))
                                    {
                                        bShouldImporte = false;
                                    }
                                }
                                else
                                {
                                    CFiltreData filtre = CFiltreData.CreateFiltreAndSurRow(keys, row, DataRowVersion.Original);
                                    DataRow[]   rows   = tableDest.Select(new CFormatteurFiltreDataToStringDataTable().GetString(filtre), "", DataViewRowState.Deleted);
                                    if (rows.Length == 1 && rows[0].RowState == DataRowState.Deleted)
                                    {
                                        bShouldImporte = false;
                                    }
                                }
                            }
                            if (bShouldImporte && row.RowState != DataRowState.Deleted)
                            {
                                tableDest.ImportRow(row);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                    finally
                    {
                    }
                }
            }
            finally
            {
                dsDest.EnforceConstraints = bOldEnforce;
            }
        }