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

https://www.vbarchiv.net
Rubrik: Datenbanken · ADO.NET Allgemein   |   VB-Versionen: VB2010 - VB201525.02.24
Ermitteln der installierten SQL-Serverversion auf zwei Arten

Die gezeigte Funktion ermittelt auf 2 Arten von Serverversion, einerseits eine umfangreiche Beschreibung und andererseits die im SSMS verwendete aus einer Enumeration. (VS 2022, Win 11)

Autor:   Dietrich HerrmannBewertung:  Views:  1.134 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein Beispielprojekt 

Die Funktion verlangt:

Imports System.Management
Imports Microsoft.SqlServer.Management.Smo

Folgende Parameter:

  • den ConnectionString zum Server und Datenbank
  • ein Flag für die Art der Ausgabe des Ergebnisses (True.. der Versionsstring wird nach Wörtern gesplittet ausgegeben, False.. der Versionsstring wird in einer Messagebox angezeigt)

Return:

  1. Nothing.. im Fall der Anzeige via Messagebox
  2. Ein Tupel mit: Feld mit gesplittetem String und SQLServerVersion gemäß SSMS-Enumeration

Bemerkungen:
Ausgangspunkt sind die derzeit möglichen SQL-Versionen, dargestellt im Feld versArray mit Jahreszahl und Versionsnummer. Die Messagebox-Verwendung dient nur der Information des Nutzers. Die Übergabe der Daten via Return erfolgt mit gesplittetem String, um Einzelzugriff auf bestimmte Daten im String haben zu können. Die SSMS-Version kann gebraucht werden, wenn man bspw. mittels meines Tipps  SQL-Scripts mit VB für Datenbanken erstellen programmatisch Scripts zur Datenbank erzeugen möchte.

Es braucht zur Anwendung noch zwei im Folgenden mit übergebene Hilfsfunktionen.

Die Funktion getSQLServerVersion:

''' <summary>
''' SQL Server Version (Langtext) ermitteln
''' </summary>
''' <param name="connStr">der Connectionstring</param>
''' <param name="mBox">True.. der Versionsstring wird gesplittet ausgegeben</param>
''' False.. der Versionsstring wird in einer Messagebox angezeigt
''' <returns>wenn messagebox, dann Nothing, sonst ein Feld der Wörter des Versionsstrings</returns>
Public Function getSQLServerVersion(connStr As String,
  Optional mBox As Boolean = False) _
  As Tuple(Of String(), SqlServerVersion)
 
  Dim rs(), si() As String, strVers As SqlServerVersion
 
  ' das Array der Serverversionen bzgl. der entsprechenden Enumeration im SSMS
  Dim versArray(,) As String _
    = New String(,) {{2000, 80}, {2005, 90}, {2008, 100}, {0, 0},
      {2012, 110}, {2014, 120}, {2016, 130},
      {2017, 140}, {2019, 150}, {2022, 160}}
 
  ' ermitteln der Serverversion mittels Connection zum Server
  Using connection As New SqlConnection(connStr)
    connection.Open()
    Dim cmdText As String = "Select @@version"
    Dim command As New SqlCommand(cmdText, connection)
    Dim reader As SqlDataReader = command.ExecuteReader()
    While reader.Read()
      rs = Split(reader.GetString(0), vbLf)
      If Not mBox Then
        MessageBox.Show(reader.GetString(0))
        Return Nothing
      End If
    End While
    reader.Close()
    connection.Close()
  End Using
 
  ' ermitteln der Serverversion aus SSMS-Enumeration
  si = IndexofMultiDimStr(versArray, CShort(mitteTeilWorte(rs(0), 3, 3)))
  strVers = si(0)
 
  Return Tuple.Create(rs, strVers)
End Function

Zugriff auf die Ergebnisse:

Dim sp() As String, sv As SqlServerVersion
Dim st As Tuple(Of String(), SqlServerVersion)
st = getSQLServerVersion(MyConnectionString, True)
sp = st.Item1
sv.Item2

Die beiden Hilfsfunktionen:

''' <summary>
''' Suchen eines Wertes im 2-dimensionalen Array
''' </summary>
''' <param name="theArray">das zu durchsuchende Feld</param>
''' <param name="theValue">der zu suchende Wert</param>
''' <returns>wenn Wert nicht gefunden => Nothing
''' wenn Wert gefunden => 2-dim. Feld mit den Indizes des Wertes</returns>
Public Function IndexofMultiDimStr(theArray(,) As String, theValue As String) As String()
  Dim w As Boolean = False
  Dim i, j As Short
  Dim rnk As Short = theArray.Rank
  Dim u1 As Short = UBound(theArray, 1)
  Dim u2 As Short = UBound(theArray, 2)
  Dim tmp(1) As String
 
  tmp(0) = Nothing : tmp(1) = Nothing
  For i = 0 To u1
    For j = 0 To u2
      If IsNothing(theArray(i, j)) Then Return tmp
      w = theArray(i, j).Equals(theValue)
      If w Then Exit For
    Next j
    tmp(1) = j
    If w Then Exit For
  Next i
  If w Then
    tmp(0) = i
  End If
  Return tmp
End Function
' Ermitteln ein oder mehrerer Worte in einem String mittels Nummer des/der Worte
Public Function mitteTeilWorte(BaseString As String,
  Optional anf As Integer = 0, Optional ende As Integer = 0,
  Optional delim As String = " ") As String
 
  Dim spl() As String = Split(BaseString, delim)
  Dim t As String = ""
 
  If ende = 0 Then ende = spl.Length - 1
  For i As Short = anf To ende
    t += spl(i) + delim
  Next
  Return t
 End Function



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