APSQL

Utiliser les objets SMO en C#

Pour utiliser les objets SMO et ainsi travailler directement sur l'instance SQL Server, le projet C# (ici en mode console), doit référencer les assemblies SMO. Pour cela, une fois le projet créé, il faut se rendre sur l'onglet Parcourir de la boite de dialogue Ajouter une référence. Cette boite de dialogue est accessible par le menu Projet - Ajouter une référence.

Boite de dialogue Ajouter une référence

Les assemblies à référencer sont situées dans le dossier C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies et correspondent aux fichiers suivants:

  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.ServiceBrokerEnum.dll
  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.SmoEnum.dll
  • Microsoft.SqlServer.SqlEnum.dll
  • Microsoft.SqlServer.WmiEnum.dll

Se connecter à la base

La connexion à l'instance SQL Server peut être abordée de différentes façons. La première, et sans aucun doute la plus simple, consiste à se connecter à l'instance locale de SQL Server.Télécharger le code source


using Microsoft.SqlServer.Management.Smo;
...
Server srv; 
// Etablir la connexion avec le serveur de base de donées
srv = new Server();
Console.WriteLine("Connexion à l'instance SQL Serversur:" + srv.Information.NetName);
Console.ReadKey();
//Fermer la connexion
srv.ConnectionContext.Disconnect();
			
			

De la même façon, il est possible de passer des paramètres lors de la construction de l'objet Server pour se connecter à une autre instance que l'instance locale par défaut, et pour utiliser la sécurité SQL Server.Télécharger le code source


using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

Server srv;
ServerConnection connection;
connection = new ServerConnection();
//-----------> mode de sécurité SQL Server : compte utilisateur et mot de passe
connection.LoginSecure = false;
connection.Login = "utilisateur"; 
connection.Password = "secret"; 
//-----------> nom du serveur
connection.ServerInstance = "TOURNETTE";
// Etablir la connexion avec le serveur de base de donées
srv = new Server(connection);
Console.WriteLine("Connexion à l'instance SQL Serversur:" + srv.Information.NetName);
Console.ReadKey();
//Fermer la connexion
srv.ConnectionContext.Disconnect();
			

Créer une base et une table

Maintenant que les opérations de connections et de déconnections sont gérés, il est possible de travailler avec les différents objets présents sur le serveur. Ainsi dans l'exemple suivant la connexion est positionnée sur la base club (équivalant l'instruction Transact SQL use club;) puis la table EssaiTable munie de 2 colonnes est définie sur cette base. Il est ainsi possible de modifier la structure des tables, des vues, ... bref de tous les éléments définis sur la base de données.Télécharger le code source


Server srv;
ServerConnection connection;
connection = new ServerConnection();
//-----------> mode de sécurité Windows
connection.LoginSecure = true;
//-----------> nom du serveur
connection.ServerInstance = "jgabillaud";
// Etablir la connexion avec le serveur de base de donées
srv = new Server(connection);
try
{
	//-------> Créer une nouvelle base de données
	Database bdd = new Database(srv,"TestSMO");
	bdd.Create();
	//-------> Créer une nouvelle table avec une colonne
	Table table = new Table(bdd, "EssaiTable");
	Column col1=new Column(table,"cle",new DataType(SqlDataType.Int));
	table.Columns.Add(col1);
	table.Create();
}
catch (FailedOperationException e)
{
	//-------> Afficher le message d'erreur
	Console.WriteLine(e.Message);
	Console.WriteLine(e.StackTrace);
}
//Fermer la connexion
srv.ConnectionContext.Disconnect();
			

Ajouter une table et ses contraintes d'intégrités dans une base existante

L'exemple suivant permet d'ajouter une table sur la base d'exemple. Pour faire référence à la base le constructeur de l'objet Database utilise le db_id de la base. Cette valeur peut être connue en exécutant la procédure stockée sp_helpdb. Une autre méthode consiste à parcourir la collection Databases associée à la connexion pour sélectionner la base avec laquelle on souhaite travailler.Télécharger le code source


Server srv;
ServerConnection connection;
connection = new ServerConnection();
//-----------> mode de sécurité Windows
connection.LoginSecure = true;
//-----------> nom du serveur
connection.ServerInstance = "TOURNETTE";
// Etablir la connexion avec le serveur de base de donées
srv = new Server(connection);
//---------- Créer une table sur la base Club existante
try
{
	Database bdd;
	bdd = srv.Databases.ItemById(15);   //Le db_id est connu à partir de sp_helpdb
	Table TypeEpreuves = new Table(bdd, "TypeEpreuves");
	Column code, libelle;
	code = new Column(TypeEpreuves, "code", new DataType(SqlDataType.Int));
	code.Identity = true;       //colonne de type identité
	code.Nullable = false;      //Les valeurs null son interdite
	
	//participe à la clé primaire : Création d'un index de type clé primaire
	Index pk_typeEpreuves = new Index(TypeEpreuves, "PK_TypeEpreuves");
	pk_typeEpreuves.IndexKeyType = IndexKeyType.DriPrimaryKey;           
	pk_typeEpreuves.IndexedColumns.Add(new IndexedColumn(pk_typeEpreuves, "code"));
	// Lier l'index à la table
	TypeEpreuves.Indexes.Add(pk_typeEpreuves);
	

	TypeEpreuves.Columns.Add(code);
	libelle = new Column(TypeEpreuves, "libelle", new DataType(SqlDataType.NVarChar));
	libelle.DataType.MaximumLength = 80;
	libelle.Nullable = false;
	TypeEpreuves.Columns.Add(libelle);
	//----------- Contrainte d'unicité sur le libellé
	Index un_typeEpreuves = new Index(TypeEpreuves, "UN_TypeEpreuves");
	un_typeEpreuves.IndexKeyType = IndexKeyType.DriUniqueKey;
	un_typeEpreuves.IndexedColumns.Add(new IndexedColumn(un_typeEpreuves, "libelle"));
	TypeEpreuves.Indexes.Add(un_typeEpreuves);
	
	TypeEpreuves.Create();
	Console.WriteLine(bdd.ID);
}
catch (FailedOperationException e)
{
	Console.WriteLine(e.Message);
}
		

Modifier une table

Dans cet exemple la base de données est parcourue à la recherche de la table à modifier. Ensuite une colonne est ajoutée à la table. Enfin une contrainte de clé étrangère est définie entre la table modifiée et une autre table de la base. Toutes les opérations se déroulent sur le schéma de l'utilisateur courant (dbo en l'occurrence). Télécharger le code source


 try
	{
		//---- Se positionner sur la base Club (db_id=15 dans cet exemple)
		Database bdd;
		bdd = srv.Databases.ItemById(15);
		//---- Se positionner sur la table des epreuves
		Table epreuves=null;
		//---- Parcourir la collection des tables
		foreach(Table test in bdd.Tables){
			if (test.Name.CompareTo("Epreuves")==0)
			{
				epreuves= test;
				break;
			}

		}
		//---- Ajouter une colonne
		Column codeType = new Column(epreuves, "codeType", new DataType(SqlDataType.Int));
		epreuves.Columns.Add(codeType);
		epreuves.Alter();
		//---- Ajouter une contrainte de clé étrangère
		ForeignKey fk_epreuves_types = new ForeignKey(epreuves, "FK_EPREUVES_TYPES");

		// colonne clé étangère
		ForeignKeyColumn cleEtrangere=new ForeignKeyColumn(fk_epreuves_types,"codeType","code");
		fk_epreuves_types.Columns.Add(cleEtrangere);
		// colonne référencé
		fk_epreuves_types.ReferencedTable = "TypeEpreuves";
		fk_epreuves_types.Create();

	}
	catch (FailedOperationException e)
	{
		Console.WriteLine(e.Message);
		Console.WriteLine(e.StackTrace);
	}