Partager via


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

  1. Démarrez Visual Studio si ce n'est déjà fait.

  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Fichier.

    La boîte de dialogue Nouveau projet s'affiche.

  3. Dans la liste Types de projets, développez le nœud Projets de base de données, puis cliquez sur Microsoft SQL Server.

  4. Dans la liste Modèles, cliquez sur SQL Server 2005.

  5. Dans la zone Nom, tapez MyAdvWorks, puis acceptez les valeurs par défaut pour Emplacement et Nom de solution.

  6. 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

  1. Dans le menu Affichage, cliquez sur Vue Schéma.

    La vue Schéma s'affiche si elle n'était pas déjà visible.

  2. Dans la vue Schéma, cliquez sur MyAdvWorks.

  3. 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.

  4. 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.

  5. 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

  1. Dans le menu Affichage, pointez sur Autres fenêtres, puis cliquez sur Explorateur de macros.

    L'Explorateur de macros apparaît.

  2. 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.

  3. Dans la zone Nom, tapez BuildActionExample.

  4. Cliquez sur Ajouter.

  5. 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.

  6. Dans la zone Nom, tapez ImportScriptsExample.

  7. 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

  1. 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.

  2. 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.

  3. 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

  1. 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.

  2. 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
    
  3. Dans la fenêtre des macros, ouvrez le menu Fichier et cliquez sur Enregistrer MyMacros.

  4. 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

  1. Dans l'Explorateur de solutions, développez le projet de base de données MyAdvWorks.

  2. Développez le dossier Objets de schéma.

  3. Développez le dossier Tables.

  4. Développez le dossier Déclencheurs.

  5. 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.

  6. Dans le menu Affichage, pointez sur Autres fenêtres, puis cliquez sur Fenêtre Commande.

    La fenêtre Commande apparaît.

  7. 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.

  8. Attendez la fin de la macro.

  9. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Autres ressources

Visual Studio Macros

Création de compléments et d'Assistants

Référencement des assemblys d'automation et de l'objet DTE2