//////////////////////////////////////////////////////////////////////////////////// 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); }
/// //////////////////////////////////////////////////////////////////////// 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; } }