Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sourceConnexion"></param>
        /// <param name="destConnexion"></param>
        /// <param name="mode">Exclude, Include or Aucun</param>
        /// <param name="liste">Liste des tables lié à l'option Mode</param>
        public static void DataBaseCopy
            (string sourceConnexion, string destConnexion, ListeMode mode, List <string> liste)
        {
            MSDBIntegration sql = new MSDBIntegration(sourceConnexion, destConnexion);

            sql.bulkcopyData(mode, liste.ToDatabaseTableList());
        }
Ejemplo n.º 2
0
        public void GetMetatDataDBScriptsTest()
        {
            string connectionStringName        = "";
            MSSQL2005_DBConnection target      = new MSSQL2005_DBConnection(connectionStringName);
            ListeMode            mode          = new ListeMode(); // TODO: initialisez à une valeur appropriée
            List <DatabaseTable> ListTableName = null;            // TODO: initialisez à une valeur appropriée
            DataSet expected = null;                              // TODO: initialisez à une valeur appropriée
            DataSet actual;

            actual = target.GetMetatDataDBScripts(mode, ListTableName);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Vérifiez l\'exactitude de cette méthode de test.");
        }
Ejemplo n.º 3
0
        /// <summary>
        ///Copie les données de la bdd Source vers la Destination pour les n dernieres lignes
        /// </summary>
        /// <param name="mode">Aucune pour ne pas prendre en compte la liste. Include si la liste est une liste de table à inclure et exclude  si la copie est sur toute la base sauf les tables de la liste</param>
        /// <param name="ListTableName">La liste des noms de tables</param>
        /// <param name="BOTTOMSize">nombre de lignes à ajouter ou null si toutes les lignes des tables sont prises </param>
        /// <param name="columnOrder">critere pour l ordre des n lignes à prendre si TOPsize est non null </param>
        public void bulkcopyData(ListeMode mode = ListeMode.Aucune, List <DatabaseTable> ListTableName = null,
                                 int?BOTTOMSize = null, string columnOrder = null)
        {
            string requestSelect;

            if (BOTTOMSize == null)
            {
                requestSelect = "SELECT * FROM {0}.{1}";
            }
            else if (columnOrder == null)
            {
                requestSelect = "SELECT TOP " + BOTTOMSize + " * FROM {0}.{1} ";
            }
            else
            {
                requestSelect = "SELECT * FROM ( SELECT TOP " + BOTTOMSize + " * FROM {0}.{1} ORDER BY " + columnOrder + " desc ) A ORDER BY " + columnOrder;
            }
            this.bulkcopyData(mode, ListTableName, requestSelect);
        }
Ejemplo n.º 4
0
        /// <summary>
        ///Copie les données de la bdd Source vers la Destination pour les lignes respectants le critere en parametre
        /// </summary>
        /// <param name="mode">Aucune pour ne pas prendre en compte la liste. Include si la liste est une liste de table à inclure et exclude  si la copie est sur toute la base sauf les tables de la liste</param>
        /// <param name="ListTableName">La liste des noms de tables</param>
        /// <param name="ColumnCriteria">nom de la colonne sur laquelle </param>
        /// <param name="CriteriaValue">critere pour l ordre des n lignes à prendre si TOPsize est non null </param>
        public void bulkcopyData(ListeMode mode        = ListeMode.Aucune, List <DatabaseTable> ListTableName = null,
                                 string ColumnCriteria = null, string CriteriaValue = "MAX")
        {
            string requestSelect;

            if (ColumnCriteria == null)
            {
                requestSelect = "SELECT * FROM {0}.{1}";
            }
            else if (CriteriaValue == "MAX")
            {
                requestSelect = "SELECT * FROM {0}.{1} where " + ColumnCriteria + " = (select MAX(" + ColumnCriteria + ") from  {0}.{1} )";
            }
            else if (CriteriaValue == "MIN")
            {
                requestSelect = "SELECT * FROM {0}.{1} where " + ColumnCriteria + " = (select MIN(" + ColumnCriteria + ") from  {0}.{1} )";
            }
            else
            {
                requestSelect = "SELECT * FROM {0}.{1} where " + ColumnCriteria + " = " + CriteriaValue;
            }
            this.bulkcopyData(mode, ListTableName, requestSelect);
        }
Ejemplo n.º 5
0
        /// <summary>
        ///Copie les données de la bdd Source vers la Destination
        ///note1: Identity column: copy as it from source to destination, using KeepIdentity option
        ///note2: Null values: copy as it even if column has default value, using KeepNulls option
        /// </summary>
        /// <param name="mode">Aucune pour ne pas prendre en compte la liste. Include si la liste est une liste de table à inclure et exclude  si la copie est sur toute la base sauf les tables de la liste</param>
        /// <param name="ListTableName">La liste des noms de tables</param>
        /// <param name="requestSelect">la requete utilisée pour recupérer les données sur chaque table, paramètres {0} pour le schema et {1} pour le nom de table</param>
        public void bulkcopyData(ListeMode mode, List <DatabaseTable> ListTableName, string RequestSelect)
        {
            // Open a sourceConnection to the first database
            SourceConnection.Open();

            //SMO Server object setup with SQLConnection.

            Server server = new Server(new ServerConnection((SqlConnection)SourceConnection.Connection));
            string dbName = SourceConnection.Connection.Database.ToString();

            //Set Database to the database
            Database db = server.Databases[dbName];

            //connection en destination
            DestinationConnection.Open();
            SqlBulkCopyOptions Options     = SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.KeepIdentity;
            SqlTransaction     Transaction = ((SqlConnection)DestinationConnection.Connection).BeginTransaction();

            SqlBulkCopy bulkCopy = new SqlBulkCopy((SqlConnection)DestinationConnection.Connection, Options, Transaction);

            bulkCopy.BulkCopyTimeout = 120;
            bulkCopy.BatchSize       = 1500;

            string        requestSelectToExecute = null;
            Table         table  = null;
            SqlDataReader reader = null;

            try
            {
                foreach (Table myTable in db.Tables)
                {
                    // si il y a une liste
                    if (mode.Equals(ListeMode.Include))// if this table t is in our parameter list => include it
                    {
                        if (!ListTableName.Contains(myTable.Name, myTable.Schema))
                        {
                            continue;
                        }
                    }
                    else if (mode.Equals(ListeMode.Exclude)) // if this table t is in our parameter list => do not include it
                    {
                        if (ListTableName.Contains(myTable.Name, myTable.Schema))
                        {
                            continue;
                        }
                    }
                    table = myTable;

                    //InfoLogger.Debug("Desactivation des cles identity sur la table : " + table.Name);
                    string     requestSet        = String.Format(SET_IDENTITY_ONOFF, table.Schema, table.Name, "ON");
                    SqlCommand SqlCmdSetIdentity = new SqlCommand(requestSet, (SqlConnection)DestinationConnection.Connection, Transaction);
                    int        nb = SqlCmdSetIdentity.ExecuteNonQuery();
                    InfoLogger.Debug("Desactivation des cles identity sur la table : OK " + nb);

                    InfoLogger.Debug("Obtention des données table : " + table.Name);
                    // Get data from the source table as a SqlDataReader.
                    requestSelectToExecute = String.Format(RequestSelect, table.Schema, table.Name);
                    SqlCommand commandSourceData = new SqlCommand(
                        requestSelectToExecute, (SqlConnection)
                        SourceConnection.Connection);
                    reader = commandSourceData.ExecuteReader();
                    InfoLogger.Debug(" -- OK");

                    InfoLogger.Debug("Ecriture des données nouvelle BDD");

                    // Write from the source to the destination.
                    bulkCopy.DestinationTableName = table.Schema + "." + table.Name;
                    bulkCopy.WriteToServer(reader);

                    InfoLogger.Debug(" -- OK");
                    reader.Close();

                    InfoLogger.Debug("reactivation des cles identity sur la table : " + table.Name);
                    requestSet        = String.Format(SET_IDENTITY_ONOFF, table.Schema, table.Name, "OFF");
                    SqlCmdSetIdentity = new SqlCommand(requestSet, (SqlConnection)DestinationConnection.Connection, Transaction);
                    nb = SqlCmdSetIdentity.ExecuteNonQuery();
                    InfoLogger.Debug("reactivation des cles identity sur la table : OK " + nb);
                }//Fin foreach

                // Transaction OK : commit all stuff: for all tables
                Transaction.Commit();
            }
            catch (Exception ex)
            {
                if (table != null)
                {
                    ExceptionLogger.Error("BULK IMPOSSIBLE " + requestSelectToExecute + " DANS " + table.Schema + "." + table.Name);
                }
                ExceptionLogger.Error(ex);

                // cancel all modif
                Transaction.Rollback();
                throw ex;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
                Transaction.Dispose();
            }

            DestinationConnection.Close();
            SourceConnection.Close();
        }
Ejemplo n.º 6
0
        ///// <summary>
        ///// Operateur pour convertir un type de données DataSet en type SQL Server
        ///// </summary>
        ///// <param name="dataType"></param>
        ///// <returns></returns>
        //public static DataType getDataType(string DT)
        //{
        //    DataType DTTemp = null;

        //    switch (DT)
        //    {
        //        case ("System.Decimal"):
        //            DTTemp = DataType.Decimal(2, 18);
        //            break;
        //        case ("System.String"):
        //            DTTemp = DataType.VarChar(50);
        //            break;
        //        case ("System.Int32"):
        //            DTTemp = DataType.Int;
        //            break;
        //        case ("System.Double"):
        //            DTTemp = DataType.Float;
        //            break;
        //        case ("System.DateTime"):
        //            DTTemp = DataType.DateTime;
        //            break;
        //        case ("System.Single"):
        //            DTTemp = DataType.Real;
        //            break;
        //        default:
        //            ExceptionLogger.Error("Convertion of " + DT + " to SqlServer.management.Smo.DataType UNKNOWN");
        //            break;
        //    }
        //    return DTTemp;
        //}



        /// <summary>
        ///Copie les données de la bdd Source vers la Destination pour toutes les tables, ou pour celles incluent dans la liste (en mode Include) ou toutes sauf celles de la liste (en mode Exclude)
        /// </summary>
        /// <param name="mode">Aucune pour ne pas prendre en compte la liste. Include si la liste est une liste de table à inclure et exclude  si la copie est sur toute la base sauf les tables de la liste</param>
        /// <param name="ListTableName">La liste des noms de tables</param>
        public void bulkcopyData(ListeMode mode = ListeMode.Aucune, List <DatabaseTable> ListTableName = null)
        {
            string requestSelect = "SELECT * FROM {0}.{1}";

            this.bulkcopyData(mode, ListTableName, requestSelect);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Copie les métata data (schema, tables, PK et FK, ProcStock d'une BDD dans un tableau à 4 entrées:
        /// <list type="dd">TABLE</list>
        /// <list type="dd">SCHEMA</list>
        /// <list type="dd">FK</list>
        /// <list type="dd">PROCSTOC</list>
        /// </summary>
        /// <param name="ListMode">rien ou vide pour ne pas tenir compte de la liste , toutes les tables de la source sont concernées / "exclude" pour donner une liste de tables à exclure / "include" pour donner le nom des tables à inclure</param>
        /// <param name="ListTableName">la liste des noms des tables à considerer dns un mode exclude ou include </param>
        public override DataSet GetMetatDataDBScripts(ListeMode mode = ListeMode.Aucune, List <DatabaseTable> ListTableName = null)
        {
            // nom de la base de source
            string dbName = Connection.Database.ToString();

            // structure de retour contenant les scripts
            DataSet ds = new DataSet("SCRIPTS");

            DataTable tableDT = new DataTable("TABLE");

            tableDT.Columns.Add("sql");
            ds.Tables.Add(tableDT);

            DataTable fkDT = new DataTable("FK");

            fkDT.Columns.Add("sql");
            ds.Tables.Add(fkDT);

            DataTable procstocDT = new DataTable("PROCSTOC");

            procstocDT.Columns.Add("sql");
            ds.Tables.Add(procstocDT);

            DataTable schemaDT = new DataTable("SCHEMA");

            schemaDT.Columns.Add("sql");
            ds.Tables.Add(schemaDT);

            //SMO Server object setup with SQLConnection.
            Server server = new Server(new ServerConnection((SqlConnection)Connection));

            //Set Database to the database
            Database db = server.Databases[dbName];
            //----------------------------------------------------------------------------------------------------------------

            /*Option pour la creation des tables
             * inclus les cles primaires, les contraintes nonclustered et
             * if not exist pour ne pas creer une table qui existe deja*/
            ScriptingOptions tablesScriptOptions = new ScriptingOptions();

            tablesScriptOptions.DriPrimaryKey      = true;
            tablesScriptOptions.IncludeIfNotExists = true;
            tablesScriptOptions.DriNonClustered    = true;

            /*Option pour les foreign key de chaque table,
             * préposé de leur schéma*/
            ScriptingOptions fkScriptOptions = new ScriptingOptions();

            fkScriptOptions.SchemaQualifyForeignKeysReferences = true;
            fkScriptOptions.DriForeignKeys = true;

            InfoLogger.Debug("Obtention metadonnees tables et clefs");

            StringCollection schemaCollection = new StringCollection();

            foreach (Table myTable in db.Tables)
            {
                // si il y a une liste
                if (mode.Equals(ListeMode.Include))
                {
                    if (!ListTableName.Contains(myTable.Name, myTable.Schema))
                    {
                        continue;
                    }
                }
                else if (mode.Equals(ListeMode.Exclude))
                {
                    if (ListTableName.Contains(myTable.Name, myTable.Schema))
                    {
                        continue;
                    }
                }

                //Si c'est un nouveau schéma on retient son nom
                if (!schemaCollection.Contains("[" + myTable.Schema + "]"))
                {
                    schemaCollection.Add("[" + myTable.Schema + "]");
                }

                //On ajoute le script de la table à tableCol
                StringCollection tableScripts = myTable.Script(tablesScriptOptions);
                // maj de la Dataset
                DataRow dr = tableDT.NewRow();
                foreach (string scriptLine in tableScripts)
                {
                    dr["sql"] += scriptLine + System.Environment.NewLine;
                }
                tableDT.Rows.Add(dr);


                //On ajoute le script des foreign keys à foreignKeyCol
                ForeignKeyCollection fk = myTable.ForeignKeys;
                foreach (ForeignKey myFk in fk)
                {
                    StringCollection stmp = myFk.Script(fkScriptOptions);
                    // maj de la Dataset
                    DataRow fkDr = fkDT.NewRow();
                    foreach (string scriptLine in stmp)
                    {
                        fkDr["sql"] += scriptLine + System.Environment.NewLine;
                    }
                    fkDT.Rows.Add(fkDr);
                }
            }
            //Enleve le schéma par défault
            schemaCollection.Remove("[dbo]");


            InfoLogger.Debug("Obtention des Procédures stockées");
            ScriptingOptions scrOptProcStoc = new ScriptingOptions()
            {
                NoCommandTerminator = false, ScriptBatchTerminator = true, IncludeIfNotExists = true
            };

            foreach (StoredProcedure sp in db.StoredProcedures)
            {
                if (!sp.Schema.Equals("sys") && !sp.IsSystemObject)
                {
                    StringCollection scsp = sp.Script(scrOptProcStoc);
                    // maj de la Dataset
                    DataRow pcDr = procstocDT.NewRow();
                    foreach (string scriptLine in scsp)
                    {
                        pcDr["sql"] += scriptLine + System.Environment.NewLine;
                    }
                    procstocDT.Rows.Add(pcDr);
                }
            }

            InfoLogger.Debug("Obtention Metadonnees schemas");
            SchemaCollection sc            = db.Schemas;
            ScriptingOptions scrOpt_Schema = new ScriptingOptions()
            {
                IncludeIfNotExists = true
            };

            foreach (Schema schem in sc)
            {
                if (schemaCollection.Contains(schem.ToString()))
                {
                    StringCollection schemaScripts = schem.Script(scrOpt_Schema);
                    // maj de la Dataset
                    DataRow schemaDr = schemaDT.NewRow();
                    foreach (string scriptLine in schemaScripts)
                    {
                        schemaDr["sql"] += scriptLine + System.Environment.NewLine;
                    }
                    schemaDT.Rows.Add(schemaDr);
                }
            }
            Connection.Close();

            return(ds);
        }
Ejemplo n.º 8
0
 /// <summary>
 /// Copie les métata data (schema, tables, PK et FK, ProcStock d'une BDD dans un tableau à 4 entrées:
 /// <list type="dd">TABLE</list>
 /// <list type="dd">SCHEMA</list>
 /// <list type="dd">FK</list>
 /// <list type="dd">PROCSTOC</list>
 /// </summary>
 /// <param name="ListMode">rien ou vide pour ne pas tenir compte de la liste , toutes les tables de la source sont concernées / "exclude" pour donner une liste de tables à exclure / "include" pour donner le nom des tables à inclure</param>
 /// <param name="ListTableName">la liste des noms des tables à considerer dns un mode exclude ou include </param>
 public abstract DataSet GetMetatDataDBScripts(ListeMode mode = ListeMode.Aucune, List <DatabaseTable> ListTableName = null);