Sébastien Pertus
Sql Server : Six façons d’administrer son serveur SQL Server
Comment administrer un serveur SQL SERVER en utilisant des scripts sql, la console de management SQL SERVER, le framework ADO.NET, le SDK SMO (Sql Management Objects), l’outil en ligne de commandes SQL CMD et enfin PowerShell.
Par Sébastien Pertus publié le 31/05/2009 à 22:28, lu 2561 fois, 7 pages
 3 | Framework.Net et ADO.NET
Nous sortons maintenant de l’environnement console d’administration SQL SERVER et nous nous tournons à présent vers une solution complètement dédiée au développeur. Celui-ci ayant pour travail d’inclure un système de sauvegarde de la base de données directement dans une application cliente.
Pour arriver au même résultat que la console d’administration, avec certes moins d’options, mais qui aura l’avantage de s’intégrer directement dans un progiciel, nous créons une application Windows Forms, avec Visual Studio 2008.
Au final l’application exemple ressemblera à ceci :
 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image6.png
 
La partie code se décompose en 2 parties distinctes :
La création du script  : Celui-ci reprend les indications de l’utilisateur final et se contente de concaténer une chaine de caractères :

/// <summary>

/// Génère le script de backup

/// </summary>

private string GenerateBackupString()

{

    StringBuilder sb = new StringBuilder();

    sb.AppendFormat("BACKUP DATABASE [{0}] ", this.databaseName);

    sb.AppendFormat("TO DISK =N'{0}_{1}_{2}.Bak' ", this.textBoxFilePath.Text.Trim(),

        this.databaseName, DateTime.Now.Ticks.ToString());

 

    // Ajout des options

    sb.Append("WITH ");

 

    // Mode

    if (comboBoxMode.SelectedText == "DIFFERENTIAL")

        sb.AppendFormat("{0} ", comboBoxMode.SelectedText);

 

    // Options classiques

    sb.Append("NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10, ");

 

    // Nom

    sb.AppendFormat("NAME = N'{0}_{1}', ", this.textBoxBackupName.Text.Trim(),

        DateTime.Now.ToString());

 

    // Description

    sb.AppendFormat("DESCRIPTION = N'{0}' ", this.textBoxDescription.Text.Trim());

 

    return sb.ToString();

}

L’exécution du script généré  : Il passe par l’utilisation de 2 composants indispensables ADO.NET :
  • Une connexion au serveur et à la base de données représentée par l’objet SqlConnection.
  • Une commande SQL a exécutée sur cette connexion représentée par l’objet SqlCommand.
Tout ceci encapsulé dans une méthode gérant les erreurs, nous ne sommes pas à l’abri d’un problème de réseau, d’un serveur SQL SERVER arrêté etc..

/// <summary>

/// Make backup

/// </summary>

private BackupResult MakeBackup(String script)

{

    SqlConnection connection = new SqlConnection(

        BackupByAdoNet.Properties.Settings.Default.PerfSampleConnectionString);

    try

    {

        // Récupération des informations de sauvegarde

        connection.FireInfoMessageEventOnUserErrors = true;

        connection.InfoMessage += new SqlInfoMessageEventHandler(connection_InfoMessage);

 

        // Création de la commande

        SqlCommand backupCommand = new SqlCommand(script, connection);

 

        connection.Open();

 

        backupCommand.ExecuteNonQuery();

 

        connection.Close();

 

        return new BackupResult("Sauvegarde terminée", DialogResult.OK);

 

    }

    catch (SqlException ex)

    {

        if (connection.State != ConnectionState.Closed)

            connection.Close();

 

        return new BackupResult(String.Format("Sauvegarde échouée: {0}", ex.Message),

            DialogResult.Abort);

    }

}

Note : La connexion SqlConnection permet de lever des évènements lorsqu’un message arrive depuis SQL SERVER. Nous nous accrochons à cet évènement « InfoMessage » qui nous permet d’afficher notre barre de progression.

private void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)

{

    // Report progress

    String message = e.Message;

    if (e.Errors.Count > 0 && e.Errors[0].Number == 3211)

    {

        String val = message.Substring(0, message.Length - 18);

 

        int percentage = 0;

        if (int.TryParse(val, out percentage))

        {

            backgroundWorkerBackup.ReportProgress(percentage);

        }

    }

 

}

Cette méthode utilise ADO.NET et attaque directement le serveur SQL SERVER via des scripts SQL générés par notre application.
Il nécessite donc de connaître le langage Transact-SQL nécessaire pour faire un sauvegarde.
Mais il existe une autre méthode, qui permet encore de passer par .Net et développer une interface graphique propriétaire, mais sans toutefois connaître l’ensemble des commandes SQL à exécuter : SMO
 
» Démarrer une discussion