SMO Créer une base de données en C#

Beaucoup d’applications ont besoin de leur base de données pour fonctionner. Après l’installation d’un logiciel, l’application doit donc créer sa propre base. C’est le cas de Kankuru par exemple. Après son installation, j’utilise SMO pour créer la base de données vide (mais ensuite, contrairement à cet article, j’utilise des scripts SQL pour créer les objets). Dans ce tutoriel, je vais vous montrer comment on peut se passer du moindre script T-SQL pour créer une base de données et ses objets (une table) en utilisant SMO.

Prérequis

Pour les débutants, je vous propose de consulter cet article pour apprendre à créer un projet C# + SMO.

Connexion à l’instance

Oui pour créer une base de données, il faut avant tout être connecté à une instance SQL Server ! Pour la démo, je me connecte à mon instance locale.

string _instance = "localhost";
smoCommon.ServerConnection sc = new smoCommon.ServerConnection(_instance);
sc.Connect();
smo.Server myServer = new smo.Server(sc);

Création de la base de données

Une fois connecté à l’instance, je vais créer une base de données. A ce stade, ce ne sera qu’une enveloppe vide.

smo.Database myDb = new smo.Database(myServer, "TestSMO"); // TestSMO est le nom de la base que je vais créer
myDb.Collation = "French_CI_AS"; // Un exemple de collation
myDb.RecoveryModel = smo.RecoveryModel.Simple; // Il y a aussi BulkLogged et FULL
myDb.CompatibilityLevel = smo.CompatibilityLevel.Version110; // Pour SQL Server 2012

// FileGroup et Fichiers
smo.FileGroup myFileGroup = new smo.FileGroup(myDb, "PRIMARY", false); // True pour un FileStream
myDb.FileGroups.Add(myFileGroup);

// Fichier de données
smo.DataFile myDataFile = new smo.DataFile(myFileGroup, "TestSMO_data");
myDataFile.FileName = myServer.MasterDBPath + "\TestSMO_data.mdf"; // je crée le fichier dans le répertoire par défaut de l'instance mais vous pouvez mettre un chemin complet
myDataFile.Size = 500 * 1024.0; // 500Mo
myDataFile.GrowthType = smo.FileGrowthType.Percent; // None pour pas de croissance et KB si accroissement en taille fixe
myDataFile.Growth = 12; // 12%
myDataFile.IsPrimaryFile = true; // Uniquement sur le fichier primaire hein !
myFileGroup.Files.Add(myDataFile); // j'ajoute le fichier au bon filegroup

//Fichier de transactions
smo.LogFile myLogFile = new smo.LogFile(myDb, "TestSMO_log");
myLogFile.FileName = myServer.MasterDBLogPath + "\TestSMO_log.ldf"; // je crée le fichier dans le répertoire par défaut de l'instance mais vous pouvez mettre un chemin complet
myLogFile.Size = 50 * 1024.0; // 50Mo
myLogFile.GrowthType = smo.FileGrowthType.KB; // None pour pas de croissance et Percent si accroissement en pourcentage
myLogFile.Growth = 20 * 1024.0; // 20 Mo
myDb.LogFiles.Add(myLogFile); // j'ajoute le fichier à ma base (et non pas au filegroup comme le fichier de données)

myDb.Create(); // création de la base, jusqu'ici rien n'avait été créé sur l'instance.

smo_create_database

Création de la table

Une fois ma base créée, je peux y insérer des objets. Par exemple, je vais créer une table avec 2 colonnes dont une clef primaire auto-incrémentée.

// Déclaration de la table
smo.Table myTable = new smo.Table(myDb, "TableTest1", "dbo");
// Première colonne de la table. C'est une PK auto incrémentée
smo.Column myCol1 = new smo.Column(myTable, "id", smo.DataType.Int);
myCol1.Nullable = false;
myTable.Columns.Add(myCol1);

// Auto Incrément
myCol1.Identity = true;
myCol1.IdentityIncrement = 1;

// Définition de la PK
smo.Index myPk = new smo.Index(myTable, "IXPk");
myPk.IsClustered = true;
myPk.IsUnique = true;
myPk.IndexKeyType = smo.IndexKeyType.DriPrimaryKey;
myPk.IndexedColumns.Add(new smo.IndexedColumn(myPk, myCol1.Name));
myTable.Indexes.Add(myPk);

// Deuxième colonne de la table. C'est une chaine de caractère
smo.Column myCol2 = new smo.Column(myTable, "nom", smo.DataType.VarChar(200));
myCol2.Nullable = true;
myTable.Columns.Add(myCol2);

// Création de la table
myTable.Create();

smo Create Table

Script Complet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using smoCommon = Microsoft.SqlServer.Management.Common;
using smo = Microsoft.SqlServer.Management.Smo;

namespace DemoCreateDatabase
{
class Program
{
static void Main(string[] args)
{
string _instance = "localhost";
smoCommon.ServerConnection sc = new smoCommon.ServerConnection(_instance);
sc.Connect();
smo.Server myServer = new smo.Server(sc);

smo.Database myDb = new smo.Database(myServer, "TestSMO"); // TestSMO est le nom de la base que je vais créer
myDb.Collation = "French_CI_AS"; // Un exemple de collation
myDb.RecoveryModel = smo.RecoveryModel.Simple; // Il y a aussi BulkLogged et FULL
myDb.CompatibilityLevel = smo.CompatibilityLevel.Version110; // Pour SQL Server 2012

// FileGroup et Fichiers
smo.FileGroup myFileGroup = new smo.FileGroup(myDb, "PRIMARY", false); // True pour un FileStream
myDb.FileGroups.Add(myFileGroup);

// Fichier de données
smo.DataFile myDataFile = new smo.DataFile(myFileGroup, "TestSMO_data");
myDataFile.FileName = myServer.MasterDBPath + "\TestSMO_data.mdf"; // je crée le fichier dans le répertoire par défaut de l'instance mais vous pouvez mettre un chemin complet
myDataFile.Size = 500 * 1024.0; // 50Mo
myDataFile.GrowthType = smo.FileGrowthType.Percent; // None pour pas de croissance et KB si accroissement en taille fixe
myDataFile.Growth = 12; // 12%
myDataFile.IsPrimaryFile = true; // Uniquement sur le fichier primaire hein !
myFileGroup.Files.Add(myDataFile); // j'ajoute le fichier au bon filegroup

//Fichier de transactions
smo.LogFile myLogFile = new smo.LogFile(myDb, "TestSMO_log");
myLogFile.FileName = myServer.MasterDBLogPath + "\TestSMO_log.ldf"; // je crée le fichier dans le répertoire par défaut de l'instance mais vous pouvez mettre un chemin complet
myLogFile.Size = 50 * 1024.0; // 50Mo
myLogFile.GrowthType = smo.FileGrowthType.KB; // None pour pas de croissance et Percent si accroissement en pourcentage
myLogFile.Growth = 20 * 1024.0; // 20 Mo
myDb.LogFiles.Add(myLogFile); // j'ajoute le fichier à ma base (et non pas au filegroup comme le fichier de données)

myDb.Create(); // création de la base, jusqu'ici rien n'avait été créé sur l'instance.

// Déclaration de la table
smo.Table myTable = new smo.Table(myDb, "TableTest1", "dbo");
// Première colonne de la table. C'est une PK auto incrémentée
smo.Column myCol1 = new smo.Column(myTable, "id", smo.DataType.Int);
myCol1.Nullable = false;
myTable.Columns.Add(myCol1);

// Auto Incrément
myCol1.Identity = true;
myCol1.IdentityIncrement = 1;

// Définition de la PK
smo.Index myPk = new smo.Index(myTable, "IXPk");
myPk.IsClustered = true;
myPk.IsUnique = true;
myPk.IndexKeyType = smo.IndexKeyType.DriPrimaryKey;
myPk.IndexedColumns.Add(new smo.IndexedColumn(myPk, myCol1.Name));
myTable.Indexes.Add(myPk);

// Deuxième colonne de la table. C'est une chaine de caractère
smo.Column myCol2 = new smo.Column(myTable, "nom", smo.DataType.VarChar(200));
myCol2.Nullable = true;
myTable.Columns.Add(myCol2);

// Création de la table
myTable.Create();

sc.Disconnect();
}
}
}

Conclusion

Je n’ai abordé qu’une toute petite partie des fonctionnalités de SMO mais je pense qu’en terme de création d’objets, il n’y a pas de limite.
Bien évidemment, si vous utilisez SMO pour créer une base de données, pensez à tester les exceptions !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload CAPTCHA.