16 czerwca 2011

Jak określić wersję instacji SQL Servera z poziomu aplikacji?

Wersja instancji SQL Servera


Ostatnio musiałem zaimplementować w Replication Explorer ograniczenie z jakimi wersjami SQL Server będzie mógł współpracować. Informacja o wersji instancji SQL Servera do której się łączymy znajduje się we właściwości ServerVersion obiektu SqlConnection. ServerVersion jest zwracana w następującym formacie major.minor.build (##.##.####), gdzie liczba cyfr dla major i build może być różna w zależności od wersji.

Pełną listę znaczących wersji Micrsoft SQL Server dla wersji 2000, 2005, 2008, 2008 R2 można znaleźć tutaj.

Oczywiście dokładne informacje o wersji instancji SQL Server przy pomocy T-SQL można uzyskać przy użyciu funkcji @@VERSION.

SELECT @@VERSION

Aczkolwiek, jeżeli chcemy dokonać tego z poziomu aplikacji możemy użyć  SqlConnection. ServerVersion.

Parsowanie SqlConnection.ServerVersion

Do pobrania trzech składowych wersji użyłem wyrażenia regularnego. Definiując wyrażenie (dostępne poniżej) użyłem grup do wyciągnięcia trzech elementów wersji.

(?<majorversion>\d{1,2})\.(?<minorversion>\d{1,2})\.(?<buildnumber>\d{1,4})

Do testowania i projektowania wyrażeń regularnych polecam edytor Expresso , pomaga on okiełznać trochę niekiedy skomplikowaną składnię RegEx'ów. Poniżej jest dostępna klasa pobierająca wartość pola SqlConnection.ServerVersion w konstruktorze i udostępniająca Major, Minor i Build Number jako swoje właściwości.


using System;
using System.Text.RegularExpressions;

public class SqlServerVersion
{
   public static Regex regex = new Regex(
          "(?<MajorVersion>\\d{1,2})\\.(?<MinorVersion>\\d{1,2})\\.(?<BuildNumber>\\d{1,4})",
        RegexOptions.CultureInvariant
        | RegexOptions.Compiled
        );

    public SqlServerVersion(string serverVersion)
    {
        Match serverVersionMatch = regex.Match(serverVersion);
        if(serverVersionMatch.Success)
        {
            MajorVersion = int.Parse(serverVersionMatch.Groups["MajorVersion"].Value);
            MinorVersion = int.Parse(serverVersionMatch.Groups["MinorVersion"].Value);
            BuildNumber = int.Parse(serverVersionMatch.Groups["BuildNumber"].Value);
        }
        else
        {
            throw new FormatException(
                string.Format("Server version should match following format: major.minor.build, but was {0}", 
                serverVersion));
        }
    }

    public int MajorVersion { get; set; }

    public int MinorVersion { get; set; }

    public int BuildNumber { get; set; }

    public bool  IsSqlServer2005OrHigher
    {
        get { return MajorVersion >= 9; }
    }
}


Przykładowe użycie klasy   SqlServerVersion  w akcji.

using (SqlConnection connection = new SqlConnection(connectionString))
{
  connection.Open();
  var serverVersion = new SqlServerVersion(connection.ServerVersion);
  bool isSqlServer2005orHihger = serverVersion.IsSqlServer2005OrHigher;
  ....
}

Hope, this helps.

2 komentarze:

  1. A nie prościej:

    select convert(varchar(100), serverproperty('ProductVersion'))

    ???

    I na zwróconym ciągu o postaci np. 10.0.1600.0 użyć np. funkcji PARSENAME dostępnej w T-SQL. Od ręki dostajemy wszystkie cztery człony wersji.

    OdpowiedzUsuń
  2. Różnica jest tak, że należy wykonać dodatkowe zapytanie do SQL Servera, zamiast skorzystać z właściwości obiektu SqlConnection.

    OdpowiedzUsuń

Uwaga: tylko uczestnik tego bloga może przesyłać komentarze.