Procédure pas à pas : modification de projets de base de données à l'aide du modèle Automation de Visual Studio
Mise à jour : novembre 2007
Vous pouvez modifier par programme vos projets de base de données en utilisant la prise en charge de l'extensibilité de Visual Studio. Dans Visual Studio Team System Database Edition, les projets de base de données prennent en charge le modèle Automation de Visual Studio (également appelé DTE ou « design-time extensibility ») de manière cohérente avec les projets Visual C# et Visual Basic. Pour plus d'informations sur ce modèle, consultez Extension de l'environnement Visual Studio. Dans cette procédure pas à pas, vous créez des macros Visual Studio qui utilisent le modèle Automation pour accomplir deux tâches :
Basculer l'action de génération de tous les déclencheurs dans un projet de base de données. Si la valeur des déclencheurs est "Générer", la macro la remplace par "Pas dans la génération". Si la valeur des déclencheurs est "Pas dans la génération", la macro la remplace par "Générer".
Ajouter tous les fichiers de script d'un répertoire à un dossier dans un projet de base de données. Si le dossier n'existe pas, il est créé. Seuls les fichiers de script qui ont des extensions spécifiques sont ajoutés.
Vous pourriez également effectuer ces tâches dans un complément Visual Studio écrit enVisual C# ou en Visual Basic. Pour simplifier, cette procédure pas à pas utilise des macros.
Dans les procédures suivantes, vous allez :
Créer un projet de base de données qui est organisé par type d'objet et importer le schéma de base de données AdventureWorks.
Lancer l'Explorateur de macros et créer des modules pour contenir les macros et le code de prise en charge.
Créer une macro pour basculer l'action de génération pour tous les déclencheurs d'un projet de base de données dans la solution ouverte.
Créer une macro et le code de prise en charge pour ajouter des scripts à votre projet de base de données.
Exécuter la macro ToggleTriggers à partir de la fenêtre Commande.
Exécuter la macro AddScriptsInDirectory à partir de l'Explorateur de macros.
Composants requis
Pour exécuter cette procédure pas à pas, vous devez avoir installé Database Edition. Cette procédure pas à pas suppose que vous avez installé une copie de l'exemple de base de données AdventureWorks sur un serveur de base de données qui exécute Microsoft SQL Server 2005. Vous pouvez substituer tout autre projet de base de données qui est organisé par type d'objet. Vous devez avoir un ou plusieurs fichiers possédant l'extension .sql dans un répertoire auquel vous pouvez accéder.
Pour créer un projet de base de données
Démarrez Visual Studio si ce n'est déjà fait.
Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Fichier.
La boîte de dialogue Nouveau projet s'affiche.
Dans la liste Types de projets, développez le nœud Projets de base de données, puis cliquez sur Microsoft SQL Server.
Dans la liste Modèles, cliquez sur SQL Server 2005.
Dans la zone Nom, tapez MyAdvWorks, puis acceptez les valeurs par défaut pour Emplacement et Nom de solution.
Activez la case à cocher Créer le répertoire pour la solution si elle ne l'est pas par défaut, puis cliquez sur OK.
Une solution qui contient le projet de base de données vide MyAdvWorks est créée.
Vous démarrerez ensuite le processus Importer un schéma de base de données dans lequel vous spécifiez une chaîne de connexion à la base de données source.
Pour importer le schéma de base de données à partir de la base de données AdventureWorks existante
Dans le menu Affichage, cliquez sur Vue Schéma.
La vue Schéma s'affiche si elle n'était pas déjà visible.
Dans la vue Schéma, cliquez sur MyAdvWorks.
Dans le menu Projet, cliquez sur Importer un schéma de base de données.
Remarque : Vous pouvez également cliquer avec le bouton droit sur MyAdvWorks, puis cliquer sur Importer un schéma de base de données.
L'Assistant Importation de base de données s'affiche.
Dans la liste Connexion de base de données source, cliquez sur la connexion qui correspond à votre base de données AdventureWorks existante. Si vous ne vous êtes pas encore connecté à cette base de données, vous devez d'abord créer une connexion à celle-ci. Pour plus d'informations, consultez Comment : créer une connexion de base de données.
Cliquez sur Terminer.
Comme le schéma est importé, les éléments de projet correspondant aux objets qui se trouvent dans la base de données apparaissent sous le projet de base de données dans l'Explorateur de solutions. La vue Schéma affiche les objets qui sont définis dans le projet de base de données.
Pour démarrer l'Explorateur de macros et créer des modules
Dans le menu Affichage, pointez sur Autres fenêtres, puis cliquez sur Explorateur de macros.
L'Explorateur de macros apparaît.
Dans l'Explorateur de macros, cliquez avec le bouton droit sur le nœud MyMacros et cliquez sur Nouveau module.
La boîte de dialogue Ajouter un module s'affiche.
Dans la zone Nom, tapez BuildActionExample.
Cliquez sur Ajouter.
Dans l'Explorateur de macros, cliquez avec le bouton droit sur le nœud MyMacros et cliquez sur Nouveau module.
La boîte de dialogue Ajouter un module s'affiche.
Dans la zone Nom, tapez ImportScriptsExample.
Cliquez sur Ajouter.
Ensuite, vous créez une macro pour basculer l'action de génération de tous les déclencheurs du langage de manipulation de données (DML) dans une base de données spécifiée.
Créer la macro ToggleTriggers
La macro ToggleTriggers accepte un paramètre facultatif qui est le nom du projet de base de données qui contient les déclencheurs à mettre à jour. Si vous ne spécifiez pas de nom de projet, la macro vous invitera à en saisir un. Vous pourriez également modifier la macro de manière identifier le type de chaque projet dans la solution et mettre à jour tous les projets de base de données. Toutefois, cette approche n'entre pas dans le cadre de cette procédure pas à pas.
Pour créer la macro ToggleTriggers
Dans l'Explorateur de macros, cliquez avec le bouton droit sur le module BuildActionExample et cliquez sur Édition.
La fenêtre Microsoft Visual Studio Macros apparaît. Cette fenêtre affiche le contenu de votre module BuildActionExample.
Remplacez le contenu du module par le code VBScript suivant :
Imports System Imports System.ComponentModel Imports EnvDTE Imports EnvDTE80 Imports System.Diagnostics Public Module BuildActionExample ' Macro to toggle the BuildAction for all DML triggers ' in a database project. ' Before running this macro, you must: ' 1) Ensure that a solution file is open and saved to disk. ' 2) Pass in the name of a database project contained in the ' open solution in the dbProjName parameter. Sub ToggleTriggers(Optional ByVal dbProjName As String = "") Dim project As Project ' if the database project name was not passed in, prompt the user for it. If (String.IsNullOrEmpty(dbProjName)) Then dbProjName = InputBox("Type the database project name.") If (String.IsNullOrEmpty(dbProjName)) Then Return End If End If ' Loop through each project until we find the one we want For Each project In DTE.Solution Dim projectItem As EnvDTE.ProjectItem 'Look for a project whose name matches the parameter If (dbProjName.Equals(project.Name)) Then 'Then loop through the project items, looking for 'the Schema Objects folder. For Each projectItem In project.ProjectItems() If (projectItem.Name = "Schema Objects") Then ' loop through the subfolders and list the files, looking for the Tables sub-folder Dim subItem As EnvDTE.ProjectItem For Each subItem In projectItem.ProjectItems() If (subItem.Name = "Tables") Then ' loop through looking for the Triggers subfolder Dim subsubItem As EnvDTE.ProjectItem For Each subsubItem In subItem.ProjectItems() If (subsubItem.Name = "Triggers") Then ' okay, we're in the right folder, now set the build actions Dim triggerItem As EnvDTE.ProjectItem For Each triggerItem In subsubItem.ProjectItems() 'MsgBox(" trigger: " + triggerItem.Name) Dim buildAction As EnvDTE.Property buildAction = triggerItem.Properties.Item("DBProjectBuildAction") ' here we toggle the build action. If it was NotInBuild(0), ' we set it to Build(1). If it was Build(1), then we set it ' to NotInBuild(0). If (buildAction.Value = 0) Then buildAction.Value = 1 ElseIf (buildAction.Value = 1) Then buildAction.Value = 0 End If Next End If Next End If Next End If Next End If Next End Sub End Module
La macro itère sur le contenu de la solution jusqu'à ce qu'elle trouve le projet de base de données dont le nom correspond au nom que vous avez spécifié. Après avoir identifié ce projet, la macro itère sur les éléments du projet, en recherchant le dossier Éléments de solution. Dans le dossier Éléments de solution, la macro recherche le dossier Tables et, dans celui-ci, recherche le dossier Déclencheurs. La macro récupère ensuite la valeur de la propriété DBProjectBuildAction pour chaque déclencheur. Si la valeur est 1 (Générer), elle passe à 0 (Pas dans la génération). De même, si la valeur est 0, elle passe à 1. Bien que le nom de la propriété dans la fenêtre Propriétés soit Action de génération, le nom de propriété sous-jacent est DBProjectBuildAction.
Dans la fenêtre des macros, ouvrez le menu Fichier et cliquez sur Enregistrer MyMacros.
Ensuite, vous créez la macro qui ajoute les fichiers de script d'un répertoire au projet de base de données spécifié.
Créer la macro AddScriptsInDirectory
La macro AddScriptsInDirectory accepte trois paramètres : le nom du projet de base de données auquel vous souhaitez ajouter les fichiers de script, le nom du dossier dans le projet de base de données où vous souhaitez ajouter les scripts, et le chemin d'accès qui contient les fichiers de script que la macro importera. Si vous ne spécifiez pas ces paramètres lorsque vous exécutez la macro, vous serez invité à les entrer. Si vous ne spécifiez pas le nom d'un dossier du projet en réponse à l'invite correspondante, les fichiers seront ajoutés au dossier Scripts.
Cette macro est plus complexe que la précédente. Pour simplifier, vous générez la macro AddScriptsInDirectory en créant les deux fonctions suivantes et deux sous-routines :
Fonction IsFileIncluded Cette fonction vérifie si l'extension d'un nom de fichier spécifié se trouve dans la liste d'extensions pour les fichiers qui doivent être traités comme des scripts et ajoutés au projet de base de données.
Fonction GetOutputWindowPane Cette fonction retourne la fenêtre Sortie afin que les messages de progression puissent être signalés.
Sub AddScriptsInDirectory2 Cette sous-routine accepte un dossier du projet et un chemin d'accès, et ajoute tous les fichiers dont les extensions correspondent à la liste des extensions de script.
Sub AddScriptsInDirectory Routine d'entrée pour cette macro, qui traite les paramètres qui lui sont passés, exécute la validation et, soit crée le dossier de destination, soit le recherche dans le projet de base de données si le dossier existe déjà. La sous-routine appelle ensuite AddScriptsInDirectory2 pour ajouter des fichiers à ce dossier.
Pour créer la macro AddScriptsInDirectory
Dans l'Explorateur de macros, cliquez avec le bouton droit sur le module ImportScriptsExample et cliquez sur ·Édition.
La fenêtre Microsoft Visual Studio Macros apparaît. Cette fenêtre affiche le contenu de votre module ImportScriptsExample.
Remplacez le contenu du module par le code VBScript suivant :
Imports System Imports EnvDTE Imports EnvDTE80 Imports System.Diagnostics Public Module ImportScriptsExample ' A list of folder names, file names, and extensions that we want to add ' to the solution. Dim outputWindowPaneTitle As String = "Add scripts to a project folder report" Dim includedExtensions As New System.Collections.Specialized.StringCollection ' Function to filter out folder names, file names, and extensions that we do not ' want to add to the solution. Function IsFileIncluded(ByVal filePath As String) As Boolean Dim extension As String Dim fileName As String extension = System.IO.Path.GetExtension(filePath) extension = extension.ToLower() fileName = System.IO.Path.GetFileName(filePath) fileName = fileName.ToLower() If (includedExtensions.Contains(extension)) Then Return True Else If (includedExtensions.Contains(fileName)) Then Return True Else Return False End If End If End Function ' This function retrieves the output window pane Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane Dim window As Window Dim outputWindow As OutputWindow Dim outputWindowPane As OutputWindowPane window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) If show Then window.Visible = True outputWindow = window.Object Try outputWindowPane = outputWindow.OutputWindowPanes.Item(Name) Catch e As System.Exception outputWindowPane = outputWindow.OutputWindowPanes.Add(Name) End Try outputWindowPane.Activate() Return outputWindowPane End Function ' Given a folder within the solution and a folder on disk, add all files whose extensions ' are on a list of "good" extensions to the folder in the solution. Sub AddScriptsInDirectory2(ByVal newScriptFolder As ProjectItem, ByVal startFolder As String) Dim files As String() Dim file As String Dim folder As String ' get a list of files in the specified folder files = System.IO.Directory.GetFiles(startFolder) ' get the output window pane so we can report status Dim outputWindowPane As EnvDTE.OutputWindowPane outputWindowPane = GetOutputWindowPane(outputWindowPaneTitle, True) ' Examine all the files within the folder. For Each file In files ' if this file's extension is one we want to include... If (IsFileIncluded(file)) Then ' try to add it to the folder Dim projItem As ProjectItem Try projItem = newScriptFolder.ProjectItems().AddFromFile(file) outputWindowPane.OutputString("The item """ + file + """ was added" + vbLf) If (Not (projItem Is Nothing)) Then If (Not (projItem.Document Is Nothing)) Then projItem.Document.Close(vsSaveChanges.vsSaveChangesNo) End If End If Catch ' if an error occurs, report the failure outputWindowPane.OutputString("The item """ + file + """may have not been added to the solution." + vbLf) End Try End If Next End Sub ' creates a new subfolder within the Scripts folder in the specified database project ' then adds all files in the specified path to the newly created scripts sub-folder. Sub AddScriptsInDirectory(Optional ByVal dbProjName As String = "", Optional ByVal scriptFolderName As String = "", Optional ByVal startFolder As String = "") If (String.IsNullOrEmpty(dbProjName)) Then dbProjName = InputBox("Type the name of the database project to which you want the scripts to be imported.") If (String.IsNullOrEmpty(dbProjName)) Then Return End If End If If (String.IsNullOrEmpty(scriptFolderName)) Then scriptFolderName = InputBox("Type the script folder name.") If (String.IsNullOrEmpty(scriptFolderName)) Then scriptFolderName = "Scripts" End If End If If (String.IsNullOrEmpty(startFolder)) Then startFolder = InputBox("Type the folder path to import.") If (String.IsNullOrEmpty(startFolder)) Then Return End If End If If (System.IO.Directory.Exists(startFolder) = False) Then MsgBox("The specified folder could not be found.") Return End If GetOutputWindowPane(outputWindowPaneTitle, True).Clear() If System.IO.Directory.Exists(startFolder) = False Then Dim outputWindowPane As EnvDTE.OutputWindowPane outputWindowPane = GetOutputWindowPane(outputWindowPaneTitle, True) outputWindowPane.OutputString("The path entered could not be found" + vbLf) Exit Sub End If includedExtensions = New System.Collections.Specialized.StringCollection ' If you do not want a file with a particular extension or name ' to be added, then add that extension or name to this list: includedExtensions.Add(".sql") includedExtensions.Add(".tsql") Dim newScriptFolder As ProjectItem Dim project As Project ' now check to see if the desired folder in the project already exists For Each project In DTE.Solution Dim projectItem As EnvDTE.ProjectItem If (dbProjName.Equals(project.Name)) Then Dim found As Boolean found = False For Each projectItem In project.ProjectItems() If (scriptFolderName.Equals(projectItem.Name)) Then ' the desired folder already exists, save the projectItem that corresponds ' to the folder. found = True newScriptFolder = projectItem End If Next ' if the folder does not exist within the project, create it. If (Not found) Then ' the folder does not already exist, so create it newScriptFolder = project.ProjectItems().AddFolder(scriptFolderName, EnvDTE.Constants.vsProjectItemKindPhysicalFolder) End If End If Next ' now add the scripts in the folder to the project folder AddScriptsInDirectory2(newScriptFolder, startFolder) End Sub End Module
Dans la fenêtre des macros, ouvrez le menu Fichier et cliquez sur Enregistrer MyMacros.
Dans le menu Fichier, cliquez sur Fermer et revenir.
Ensuite, vous exécuterez vos macros pour illustrer les résultats.
Exécuter la macro ToggleTriggers
Si vous exécutez les macros avec une solution autre que celle que vous avez créée dans cette procédure pas à pas, vous devez spécifier le nom du projet de base de données qui est contenu dans votre solution au lieu de MyAdvWorks.
Pour exécuter la macro ToggleTriggers à partir de la fenêtre Commande
Dans l'Explorateur de solutions, développez le projet de base de données MyAdvWorks.
Développez le dossier Objets de schéma.
Développez le dossier Tables.
Développez le dossier Déclencheurs.
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur un déclencheur, puis cliquez sur Propriétés.
Notez la valeur de la propriété Action de génération pour le déclencheur que vous avez choisi.
Dans le menu Affichage, pointez sur Autres fenêtres, puis cliquez sur Fenêtre Commande.
La fenêtre Commande apparaît.
Dans la fenêtre Commande, tapez le code suivant :
Macros.MyMacros.BuildActionExample.ToggleTriggers MyAdvWorks
MyAdvWorks est le nom du projet de base de données dont la propriété Action de génération de ses déclencheurs sera basculée.
Attendez la fin de la macro.
Lorsque l'exécution de la macro se termine, consultez les propriétés du déclencheur à partir de l'étape 5.
La valeur de la propriété Action de génération est l'inverse de ce qu'elle était avant l'exécution de la macro.
Vous pouvez exécuter à nouveau la macro pour rétablir les valeurs de la propriété Action de génération à leur état d'origine.
Ensuite, vous exécutez la macro AddScriptsInDirectory à partir de l'Explorateur de macros.
Exécuter la macro AddScriptsInDirectory
Si vous exécutez les macros avec une solution autre que celle que vous avez créée dans cette procédure pas à pas, vous devez spécifier le nom du projet de base de données qui est contenu dans votre solution au lieu de MyAdvWorks.
Pour exécuter la macro AddScriptsInDirectory à partir de l'Explorateur de macros
Si l'Explorateur de macros n'est pas ouvert, ouvrez le menu Affichage, pointez sur Autres fenêtres et cliquez sur Explorateur de macros.
L'Explorateur de macros apparaît.
Dans l'Explorateur de macros, cliquez avec le bouton droit sur AddScriptsInDirectory (vous devrez peut-être développer le module ImportScriptsExample pour afficher la macro) et cliquez sur Exécuter.
La boîte de dialogue Visual Studio Macros apparaît, vous invitant à taper le nom du projet de base de données dans lequel vous souhaitez que les scripts soient importés.
Tapez MyAdvWorkset cliquez sur OK.
La boîte de dialogue Visual Studio Macros apparaît de nouveau, vous invitant à taper le nom du dossier de script.
Cliquez sur OK pour accepter le comportement par défaut qui ajoutera les scripts au dossier Scripts.
La boîte de dialogue Visual Studio Macros apparaît de nouveau, vous invitant à taper le chemin d'accès du dossier à importer.
Tapez le chemin d'accès du dossier où se trouvent les fichiers de script comme précisé précédemment dans la section Composants requis de cette rubrique. Par exemple, si vous avez des scripts dans C:\Temp, tapez C:\Temp, puis cliquez sur OK.
La macro s'exécutera jusqu'à ce que tous les fichiers qui ont l'extension .sql ou .tsql soient ajoutés au dossier Scripts du projet de base de données MyAdvWorks.
Étapes suivantes
Cette procédure pas à pas fournit un aperçu des tâches que vous pouvez effectuer lorsque vous utilisez le modèle Automation de Visual Studio avec vos projets de base de données. Si vous avez besoin de plus de souplesse, vous pouvez utiliser le modèle Automation d'un complément Visual Studio.
Voir aussi
Concepts
Introduction à l'extensibilité de projet
Vue d'ensemble de la terminologie de Database Edition