Exemplarische Vorgehensweise: Ändern von Datenbankprojekten mithilfe des Visual Studio-Automatisierungsmodells
Aktualisiert: November 2007
Sie können die Datenbankprojekte programmgesteuert ändern, indem Sie die Erweiterungsunterstützung in Visual Studio verwenden. Die Datenbankprojekte in Visual Studio Team System Database Edition unterstützen das Visual Studio-Automatisierungsmodell (auch als Entwurfszeiterweiterung oder DTE bezeichnet) auf eine Weise, die Visual C#-Projekten und Visual Basic-Projekten entspricht. Weitere Informationen zu diesem Modell finden Sie unter Erweitern der Visual Studio-Umgebung. In dieser exemplarischen Vorgehensweise erstellen Sie Visual Studio-Makros, die mithilfe des Automatisierungsmodells die folgenden beiden Aufgaben ausführen:
Schalten Sie den Buildvorgang aller Trigger in einem Datenbankprojekt um. Wenn die Trigger auf "Build" festgelegt werden, ändert das Makro sie in "Nicht im Build". Wenn die Trigger auf "Nicht im Build" festgelegt werden, ändert das Makro sie in "Build".
Fügen Sie alle Skriptdateien in einem Verzeichnis zu einem Ordner in einem Datenbankprojekt hinzu. Falls der Ordner noch nicht vorhanden ist, wird er erstellt. Es werden nur Skriptdateien mit bestimmten Erweiterungen hinzugefügt.
Sie können diese Aufgaben auch in einem Visual Studio-Add-In ausführen, das in Visual C# oder Visual Basic geschrieben ist. Der Einfachheit halber werden in dieser exemplarischen Vorgehensweise Makros verwendet.
In den folgenden Verfahren führen Sie folgende Aufgaben aus:
Erstellen Sie ein Datenbankprojekt, das nach Objekttyp organisiert ist, und importieren Sie das Datenbankschema AdventureWorks.
Starten Sie Makro-Explorer, und erstellen Sie Module, die Makros und unterstützenden Code enthalten.
Erstellen Sie ein Makro, um den Buildvorgang aller Trigger in einem Datenbankprojekt in der geöffneten Projektmappe umzuschalten.
Erstellen Sie ein Makro und unterstützenden Code, um dem Datenbankprojekt Skripts hinzuzufügen.
Führen Sie das Makro ToggleTriggers im Befehlsfenster aus.
Führen Sie das Makro AddScriptsInDirectory im Makro-Explorer aus.
Vorbereitungsmaßnahmen
Um diese exemplarische Vorgehensweise abzuschließen, muss Database Edition installiert sein. Für diese exemplarische Vorgehensweise müssen Sie eine Kopie der Beispieldatenbank AdventureWorks auf einem Datenbankserver installiert haben, auf dem Microsoft SQL Server 2005 ausgeführt wird. Sie können jedes andere Datenbankprojekt verwenden, dass nach Objekttyp organisiert ist. Es muss mindestens eine Datei mit der Erweiterung .sql in einem Verzeichnis vorhanden sein, auf das Sie Zugriff haben.
So erstellen Sie ein Datenbankprojekt
Starten Sie Visual Studio, falls dies noch nicht geschehen ist.
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
Das Dialogfeld Neues Projekt wird angezeigt.
Erweitern Sie in der Liste Projekttypen den Knoten Datenbankprojekte, und klicken Sie auf Microsoft SQL Server.
Klicken Sie in der Liste Vorlagen auf SQL Server 2005.
Geben Sie im Feld Name den Namen MyAdvWorks ein, und übernehmen Sie die Standardwerte für Speicherort und Projektmappenname.
Aktivieren Sie ggf. das Kontrollkästchen Projektmappenverzeichnis erstellen, und klicken Sie auf OK.
Daraufhin wird eine Projektmappe erstellt, die das leere Datenbankprojekt MyAdvWorks enthält.
Starten Sie nun den Vorgang zum Importieren des Datenbankschemas, und geben Sie eine Verbindungszeichenfolge für die Quelldatenbank an.
So importieren Sie das Datenbankschema aus der vorhandenen Datenbank AdventureWorks
Klicken Sie im Menü Ansicht auf Schemaansicht.
Die Schemaansicht wird angezeigt, wenn dies nicht bereits der Fall ist.
Klicken Sie in der Schemaansicht auf MyAdvWorks.
Klicken Sie im Menü Projekt auf Datenbankschema importieren.
Hinweis: Sie können auch mit der rechten Maustaste auf MyAdvWorks und anschließend auf Datenbankschema importieren klicken.
Der Assistent zum Importieren von Datenbanken wird angezeigt.
Klicken Sie in der Liste Quelldatenbankverbindung auf die Verbindung, die der vorhandenen Datenbank AdventureWorks entspricht. Stellen Sie ggf. eine Verbindung mit dieser Datenbank her. Weitere Informationen finden Sie unter Gewusst wie: Erstellen einer Datenbankverbindung.
Klicken Sie auf Fertig stellen.
Beim Importieren des Schemas werden Projektelemente, die Objekten in der Datenbank entsprechen, unter dem Datenbankprojekt im Projektmappen-Explorer angezeigt. Die Schemaansicht zeigt die Objekte an, die im Datenbankprojekt definiert sind.
So starten Sie Makro-Explorer und erstellen Module
Zeigen Sie im Menü Ansicht auf Weitere Fenster, und klicken Sie auf Makro-Explorer.
Der Makro-Explorer wird angezeigt.
Klicken Sie im Makro-Explorer mit der rechten Maustaste auf den Knoten MyMacros, und klicken Sie auf Neues Modul.
Das Dialogfeld Modul hinzufügen wird angezeigt.
Geben Sie im Feld Name den Namen BuildActionExample ein.
Klicken Sie auf Hinzufügen.
Klicken Sie im Makro-Explorer mit der rechten Maustaste auf den Knoten MyMacros, und klicken Sie auf Neues Modul.
Das Dialogfeld Modul hinzufügen wird angezeigt.
Geben Sie im Feld Name den Namen ImportScriptsExample ein.
Klicken Sie auf Hinzufügen.
Als Nächstes erstellen Sie ein Makro, um den Buildvorgang aller DML (Data Manipulation Language)-Trigger in einer angegebenen Datenbank umzuschalten.
Erstellen des Makros ToggleTriggers
Das Makro ToggleTriggers akzeptiert einen optionalen Parameter, der den Namen des Datenbankprojekts darstellt, das die zu aktualisierenden Trigger enthält. Wenn Sie keinen Projektnamen angeben, werden Sie vom Makro zur Angabe aufgefordert. Sie können das Makro ändern, um stattdessen den Typ für jedes Projekt in der Projektmappe zu identifizieren und alle Datenbankprojekte zu aktualisieren. Dieser Ansatz ist jedoch nicht im Umfang dieser exemplarischen Vorgehensweise enthalten.
So erstellen Sie das Makro ToggleTriggers
Klicken Sie im Makro-Explorer mit der rechten Maustaste auf das Modul BuildActionExample, und klicken Sie auf Bearbeiten.
Das Fenster Microsoft Visual Studio Macros wird angezeigt. Dieses Fenster zeigt den Inhalt des Moduls BuildActionExample an.
Ersetzen Sie den Inhalt des Moduls durch folgenden VBScript-Code:
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
Das Makro durchläuft den Inhalt der Projektmappe, bis das Datenbankprojekt gefunden wird, dessen Namen mit dem angegebenen Namen übereinstimmt. Nachdem das Makro das Projekt identifiziert hat, durchläuft es die Projektelemente und sucht dabei nach dem Ordner Projektmappenelemente. Im Ordner Projektmappenelemente sucht das Makro nach dem Ordner Tabellen und in diesem Ordner nach dem Ordner Trigger. Das Makro ruft dann den Wert der DBProjectBuildAction-Eigenschaft für jeden Trigger ab. Wenn der Wert 1 (Build) ist, wird er auf 0 (Nicht im Build) umgeschaltet. Entsprechend wird der Wert auf 1 umgeschaltet, wenn er 0 ist. Obwohl der Name der Eigenschaft im Fenster Eigenschaften als Build Action angezeigt wird, lautet der zugrunde liegende Eigenschaftenname DBProjectBuildAction.
Öffnen Sie im Fenster Makros das Menü Datei, und klicken Sie auf MyMacros speichern.
Erstellen Sie anschließend das Makro, das Skriptdateien in einem Verzeichnis zum angegebenen Datenbankprojekt hinzufügt.
Erstellen des Makros AddScriptsInDirectory
Das Makro AddScriptsInDirectory akzeptiert drei Parameter: den Namen des Datenbankprojekts, dem Sie die Skriptdateien hinzufügen möchten, den Namen des Ordners im Datenbankprojekt, in dem Sie die Skripts hinzufügen möchten, und den Pfad, der die Skriptdateien enthält, die vom Makro importiert werden. Wenn Sie diese Parameter beim Ausführen des Makros nicht angeben, werden Sie vom Makro zur Angabe aufgefordert. Wenn Sie als Reaktion auf die Eingabeaufforderung keinen Projektordnernamen angeben, werden die Dateien zum Ordner Skripts hinzugefügt.
Dieses Makro ist komplexer als das vorherige Makro. Der Einfachheit halber erstellen Sie das Makro AddScriptsInDirectory, indem Sie die folgenden zwei Funktionen und zwei Unterroutinen erstellen:
IsFileIncluded-Funktion Diese Funktion überprüft, ob die Erweiterung eines angegebenen Dateinamens in der Liste der Erweiterungen für Dateien enthalten ist, die als Skripts behandelt und zum Datenbankprojekt hinzugefügt werden.
GetOutputWindowPane-Funktion Diese Funktion gibt das Ausgabefenster zurück, damit Statusmeldungen gemeldet werden können.
AddScriptsInDirectory2-Unterroutine Diese Unterroutine akzeptiert einen Projektordner und einen Pfad und fügt alle Dateien hinzu, deren Erweiterungen in der Liste der Skripterweiterungen enthalten sind.
AddScriptsInDirectory-Unterroutine Die Eingaberoutine für dieses Makro. Diese Unterroutine verarbeitet die an sie übergebenen Parameter, führt Validierungen aus und erstellt entweder den Zielordner oder findet den Zielordner im Datenbankprojekt, sofern der Ordner bereits vorhanden ist. Die Unterroutine ruft dann AddScriptsInDirectory2 auf, um diesem Ordner Dateien hinzuzufügen.
So erstellen Sie das Makro AddScriptsInDirectory
Klicken Sie im Makro-Explorer mit der rechten Maustaste auf das Modul ImportScriptsExample, und klicken Sie auf Bearbeiten.
Das Fenster Microsoft Visual Studio Macros wird angezeigt. Dieses Fenster zeigt den Inhalt des Moduls ImportScriptsExample an.
Ersetzen Sie den Inhalt des Moduls durch folgenden VBScript-Code:
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
Öffnen Sie im Fenster Makros das Menü Datei, und klicken Sie auf MyMacros speichern.
Klicken Sie im Menü Datei auf Schließen und zurück.
Führen Sie anschließend die Makros aus, um die Ergebnisse zu veranschaulichen.
Ausführen des Makros ToggleTriggers
Wenn Sie die Makros mit anderen Projektmappen als den in dieser exemplarischen Vorgehensweise erstellten Projektmappen ausführen, müssen Sie statt MyAdvWorks den Namen des Datenbankprojekts angeben, das in Ihrer Projektmappe enthalten ist.
So führen Sie das Makro ToggleTriggers im Befehlsfenster aus
Erweitern Sie im Projektmappen-Explorer das Datenbankprojekt MyAdvWorks.
Erweitern Sie den Ordner Schemaobjekte.
Erweitern Sie den Ordner Tabellen.
Erweitern Sie den Ordner Trigger.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf einen beliebigen Trigger, und klicken Sie auf Eigenschaften.
Notieren Sie den Wert der Build Action-Eigenschaft für den ausgewählten Trigger.
Zeigen Sie im Menü Ansicht auf Weitere Fenster, und klicken Sie auf Befehlsfenster.
Das Befehlsfenster wird angezeigt.
Geben Sie im Befehlsfenster Folgendes ein:
Macros.MyMacros.BuildActionExample.ToggleTriggers MyAdvWorks
MyAdvWorks ist der Name des Datenbankprojekts, in dem die Build Action-Eigenschaft der Trigger umgeschaltet wurde.
Warten Sie, bis die Ausführung des Makros abgeschlossen ist.
Wenn die Ausführung des Makros abgeschlossen ist, zeigen Sie die Eigenschaften des Triggers aus Schritt 5 an.
Der Wert der Build Action-Eigenschaft ist das Gegenteil des Werts, der vor der Ausführung des Makros vorhanden war.
Sie können das Makro erneut ausführen, um die ursprünglichen Werte der Build Action-Eigenschaft wiederherzustellen.
Führen Sie als Nächstes das Makro AddScriptsInDirectory im Makro-Explorer aus.
Ausführen des Makros AddScriptsInDirectory
Wenn Sie die Makros mit anderen Projektmappen als den in dieser exemplarischen Vorgehensweise erstellten Projektmappen ausführen, müssen Sie statt MyAdvWorks den Namen des Datenbankprojekts angeben, das in Ihrer Projektmappe enthalten ist.
So führen Sie das Makro AddScriptsInDirectory im Makro-Explorer aus
Wenn der Makro-Explorer nicht geöffnet ist, öffnen Sie das Menü Ansicht, zeigen auf Weitere Fenster und klicken auf Makro-Explorer.
Der Makro-Explorer wird angezeigt.
Klicken Sie im Makro-Explorer mit der rechten Maustaste auf AddScriptsInDirectory (möglicherweise müssen Sie das Modul ImportScriptsExample erweitern, um das Makro anzuzeigen), und klicken Sie auf Ausführen.
Das Dialogfeld Visual Studio Macros wird angezeigt und gibt folgende Aufforderung aus: "Geben Sie den Namen des Datenbankprojekts ein, in das die Skripts importiert werden sollen."
Geben Sie MyAdvWorks ein, und klicken Sie auf OK.
Das Dialogfeld Visual Studio Macros wird erneut angezeigt und gibt folgende Aufforderung aus: "Geben Sie den Namen des Skriptordners ein."
Klicken Sie auf OK, um das Standardverhalten zu akzeptieren, das die Skripts dem Ordner Skripts hinzufügt.
Das Dialogfeld Visual Studio Macros wird erneut angezeigt und gibt folgende Aufforderung aus: "Geben Sie den Ordnernamen für den Import ein."
Geben Sie den Pfad ein, in dem sich die Skriptdateien befinden. Diesen Pfad haben Sie im Abschnitt "Erforderliche Komponenten" weiter oben in diesem Thema notiert. Wenn sich die Skripts z. B. in C:\Temp befinden, geben Sie C:\Temp ein und klicken dann auf OK.
Das Makro wird ausgeführt, bis alle Dateien mit den Erweiterungen .sql oder .tsql zum Ordner Skripts im Datenbankprojekt MyAdvWorks hinzugefügt wurden.
Nächste Schritte
Diese exemplarische Vorgehensweise veranschaulicht kleine Beispiele der Aufgaben, die Sie ausführen, wenn Sie das Visual Studio-Automatisierungsmodell mit Ihren Datenbankprojekten verwenden. Wenn Sie mehr Flexibilität benötigen, können Sie das Automatisierungsmodell von einem Visual Studio-Add-In verwenden.
Siehe auch
Konzepte
Einführung in die Projekterweiterbarkeit
Übersicht über die Terminologie der Database Edition