Rubrik: Datenbanken · ADO.NET Allgemein | VB-Versionen: VB2010 - VB2015 | 25.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 Herrmann | Bewertung: | Views: 1.134 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein 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:
- Nothing.. im Fall der Anzeige via Messagebox
- 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