AIDE MOI
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.IO;
using System.Threading.Tasks;
public void Main()
{
string connectionString = "Provider=MSOLAP;Data Source=VotreServeurSSAS;Initial Catalog=VotreBaseSSAS;Integrated Security=SSPI;";
string logFilePath = @"C:\Logs\SSAS_Process_Log.txt"; // Chemin du fichier log
// Créer/vider le fichier log au début du script
File.WriteAllText(logFilePath, $"--- Début du traitement SSAS ({DateTime.Now}) ---\n");
// Récupérer les dimensions et les cubes dynamiquement
List<string> dimensions = GetObjectsFromSSAS(connectionString, 3, "DIMENSION_NAME");
List<string> cubes = GetObjectsFromSSAS(connectionString, 2, "CUBE_NAME");
// Vérifier si des objets ont été trouvés
if (dimensions.Count == 0 && cubes.Count == 0)
{
File.AppendAllText(logFilePath, "❌ Aucune dimension ni cube trouvé.\n");
Dts.TaskResult = (int)ScriptResults.Failure;
return;
}
// Lancer le traitement en parallèle pour les dimensions et les cubes
List<Task> tasks = new List<Task>();
foreach (string dim in dimensions)
{
tasks.Add(Task.Run(() => ProcessObject(connectionString, dim, "Dimension", logFilePath)));
}
foreach (string cube in cubes)
{
tasks.Add(Task.Run(() => ProcessObject(connectionString, cube, "Cube", logFilePath)));
}
// Attendre la fin de tous les traitements
Task.WaitAll(tasks.ToArray());
File.AppendAllText(logFilePath, $"--- Fin du traitement ({DateTime.Now}) ---\n");
Dts.TaskResult = (int)ScriptResults.Success;
}
// Fonction générique pour récupérer la liste des dimensions ou cubes de la base SSAS
private List<string> GetObjectsFromSSAS(string connectionString, int objectType, string columnName)
{
List<string> objects = new List<string>();
string xmlaQuery = $@";
<Discover xmlns='urn:schemas-microsoft-com:xml-analysis'>
<RequestType>DISCOVER_CATALOG_METADATA</RequestType>
<Restrictions>
<RestrictionList>
<DatabaseID>VotreBaseSSAS</DatabaseID>
<ObjectType>{objectType}</ObjectType>
</RestrictionList>
</Restrictions>
<Properties>
<PropertyList>
<Catalog>VotreBaseSSAS</Catalog>
</PropertyList>
</Properties>
</Discover>";
try
{
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
using (OleDbCommand cmd = new OleDbCommand(xmlaQuery, conn))
{
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
string objectName = reader[columnName].ToString();
objects.Add(objectName);
}
}
}
}
}
catch (Exception ex)
{
File.AppendAllText(@"C:\Logs\SSAS_Process_Log.txt", $"❌ Erreur lors de la récupération des objets ({columnName}) : {ex.Message}\n");
}
return objects;
}
// Fonction pour exécuter une requête XMLA de traitement sur une dimension ou un cube
private void ProcessObject(string connectionString, string objectName, string objectType, string logFilePath)
{
string xmlaQuery = $@";
<Batch xmlns='http://schemas.microsoft.com/analysisservices/2003/engine'>
<Process>
<Object>
<{objectType}ID>{objectName}</{objectType}ID>
</Object>
<Type>ProcessFull</Type>
</Process>
</Batch>";
try
{
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
using (OleDbCommand cmd = new OleDbCommand(xmlaQuery, conn))
{
cmd.ExecuteNonQuery();
}
}
File.AppendAllText(logFilePath, $"✅ {objectType} '{objectName}' traité avec succès.\n");
}
catch (Exception ex)
{
File.AppendAllText(logFilePath, $"❌ Erreur sur {objectType} '{objectName}' : {ex.Message}\n");
}
}