vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Datenbanken · ADO.NET Allgemein   |   VB-Versionen: VB2010 - VB201501.05.22
SQL-Scripts mit VB für Datenbanken erstellen

Im Tipp wird eine Prozedur veröffentlicht, mit der es möglich ist, aus einem VB-Programm heraus bestimmte SQL-Scripts zu erzeugen.

Autor:   Dietrich HerrmannBewertung:  Views:  148 
ohne HomepageSystem:  Vista, Win7, Win8, Win10kein 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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2022 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.