Rubrik: Datenbanken · ADO.NET Allgemein | VB-Versionen: VB2010 - VB2015 | 01.05.22 |
![]() Im Tipp wird eine Prozedur veröffentlicht, mit der es möglich ist, aus einem VB-Programm heraus bestimmte SQL-Scripts zu erzeugen. | ||
Autor: ![]() | Bewertung: ![]() ![]() ![]() ![]() ![]() | Views: 1.788 |
ohne Homepage | System: Vista, Win7, Win8, Win10 | kein Beispielprojekt |
Ich habe mal nach einer Alternative zu den Archivierungsdateien.bak zu SQL-Datenbanken gesucht.
Eine Möglichkeit bietet die Erzeugung und Anwendung von Scripts zum Löschen, Kreieren und Befüllen von Datenbanken. Im SSMS über den Menüpunkt Skrips generieren manuell durchführbar. Meine Prozedur erstellt ein bestimmtes gewünschtes Script ausgehend von einer vorhandenen Datenbank. Das Script kann dann als alternatives Archiv gespeichert werden.
Folgende Parameter werden für den Aufruf der Prozedur createScript benötigt:
- srvName: es muss der Servername möglichst komplett inkl. Instanzname angegeben werden
- dbName: der Name der Datenbank, die im Script verwendet werden soll, also archiviert werden soll
- scriptArt: die Art des zu erstellenden Scripts; drei Möglichkeiten siehe Parameterbeschreibung der Prozedur
- target: die Zielversion des Servers
- debugFlag: True, wenn die Erzeugung des Scripts beim Debuggen protokolliert werden soll
Zur Erzeugung der Script-SQL-Statements wird die Prozedur createSqlStatements angewendet. Sie erzeugt den eigentlichen "Script-Text".
Folgende Parameter werden für den Aufruf der Prozedur benötigt und aus der aufrufenden Prozedur createScript übergeben:
- Server: wird übernommen
- Database: ist nicht der Name der Datenbank sondern die Datenbank selbst
- Scripter: ist sqlServer.Management.Smo.Scripter
- debugFlag: siehe oben
Für die Anwendung der Programme ist außerdem notwendig:
Imports Microsoft.SqlServer Imports Microsoft.SqlServer.Management.Common Imports Microsoft.SqlServer.Management.Sdk.Sfc Imports Microsoft.SqlServer.Management.Smo
Hier der Code für beide Prozeduren:
''' <summary> ''' Funktion zum Erzeugen eines SQL-Scripts für Übertragung von Daten ''' für alle Tabellen einer Datenbank ''' </summary> ''' <param name="srvName">der Server-Name (inkl. Instanzname)</param> ''' <param name="dbName">der Datenbankname</param> ''' <param name="scriptArt">die Art des zu erstellenden Scripts</param> ''' (scriptArt: "Schema" (Script vom Schema), "Daten" (Script von Daten) ''' oder "" (komplette Datenbank)) ''' <param name="target">die Zielversion des Servers</param> ''' <param name="debugFlag">das Script protokollieren ja|nein</param> Public Function createScript(srvName As String, dbName As String, Optional scriptArt As String = "Daten", Optional target As SqlServerVersion = SqlServerVersion.Version140, Optional debugFlag As Boolean = False) _ As String Dim script As String Dim srv As New Server(srvName) Dim Scripter As New Scripter(srv) Dim db As Database = srv.Databases(dbName) With Scripter.Options .TargetServerVersion = target Select Case scriptArt Case "Daten" .ScriptData = True .ScriptSchema = False script = createSqlStatements(srv, db, Scripter, debugFlag) Case "Schema" .ScriptSchema = True .ScriptData = False .Indexes = True ' include indizes script = createSqlStatements(srv, db, Scripter, debugFlag) Case Else ' komplette Datenbank .ScriptData = False .ScriptDrops = True .ScriptSchema = True script = createSqlStatements(srv, db, Scripter, debugFlag) .ScriptDrops = False script += createSqlStatements(srv, db, Scripter, debugFlag) .ScriptSchema = False .ScriptData = True script += createSqlStatements(srv, db, Scripter, debugFlag) End Select End With Return script End Function
''' <summary> ''' Erzeugen eines Scripts ''' </summary> ''' <param name="Server">der Server-Name (inkl. Instanzname)</param> ''' <param name="Database">die Datenbank</param> ''' <param name="Scripter">der Scripter</param> ''' <param name="debugFlag">das Script protokollieren ja|nein</param> ''' <returns></returns> Private Function createSqlStatements(Server As Server, Database As Database, Scripter As Scripter, Optional debugFlag As Boolean = False) As String Dim result As New StringBuilder For Each Table As Table In Database.Tables If Not Table.IsSystemObject Then Dim ScriptLines As List(Of String) ScriptLines = Scripter.EnumScript(New Urn() {Table.Urn}).ToList() For Each Line As String In ScriptLines result.AppendLine(Line) If debugFlag Then Debug.Print(Line) Next End If Next Return result.ToString End Function
Beispiele für die Anwendung
Es wird die komplette Datenbank DatabankName auf dem Server serverName als Script erstellt; Schema und alle Daten.
' Datenbank Dim st As String = createScript(serverName, DatabankName, "")
Erstellung eines Scripts, das ausschließlich alle Daten der Datenbank beinhaltet.
' Daten Dim st As String = createScript(serverName, DatabankName, "Daten")
Nur die Schemata aller Tabellen der Datenbank werden gespeichert als Script.
' Schema Dim st As String = createScript(serverName, DatabankName, "Schema")
Hinweis: Es empfiehlt sich für die Anwendung des Tipps, die neueste SMO-Version zu installieren.
Hier dazu der entsprechende Link (Nuget Paketverwaltung):
Installieren von SMO