Как найти текущую версию приложения уровня данных SQL Server?

Мы используем приложение уровня данных SQL Server (пакет dacpac или DAC), и мне трудно найти текущую версию базы данных.

Есть ли способ получить текущую версию любым из этих способов:

  1. Из среды SQL Server Management Studio
  2. С помощью оператора SQL
  3. Программно с использованием кода .NET

person Mark    schedule 26.07.2010    source источник


Ответы (2)


Из среды SQL Server Management Studio

От http://msdn.microsoft.com/en-us/library/ee210574.aspx

Чтобы просмотреть сведения о DAC, развернутом в экземпляре компонента Database Engine:

  1. Выберите меню Вид/Проводник объектов.

  2. Подключитесь к экземпляру из панели Обозреватель объектов.

  3. Выберите меню Просмотр/Сведения об обозревателе объектов.

  4. Выберите узел сервера в Обозревателе объектов, который соответствует экземпляру, а затем перейдите к узлу Управление\Приложения уровня данных.

  5. В представлении списка в верхней панели страницы сведений перечислены все DAC, развернутые в экземпляре компонента Database Engine. Выберите DAC, чтобы отобразить информацию на панели сведений в нижней части страницы.

Контекстное меню узла приложений уровня данных также используется для развертывания нового DAC или удаления существующего DAC.

С помощью оператора SQL

SELECT instance_name, type_version FROM msdb.dbo.sysdac_instances

С помощью оператора SQL в Azure

SELECT instance_name, type_version FROM master.dbo.sysdac_instances

Программно с использованием кода .NET

Обратите внимание, что в DacFx 3.0 это больше не действует. Смотрите мой другой ответ, чтобы узнать, как это сделать.

C#

ServerConnection serverConnection;
string databaseName;

// Establish a connection to the SQL Server instance.
using (SqlConnection sqlConnection =
    new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
{
    serverConnection = new ServerConnection(sqlConnection);
    serverConnection.Connect();

    // Assumes default database in connection string is the database we are trying to query.
    databaseName = sqlConnection.Database;
}

// Get the DAC info.
DacStore dacstore = new DacStore(serverConnection);
var dacInstance = dacstore.DacInstances[databaseName];
System.Diagnostics.Debug.Print("Database {0} has Dac pack version {1}.", databaseName, dacInstance.Type.Version);

ВБ.NET

Dim serverConnection As ServerConnection
Dim databaseName As String

' Establish a connection to the SQL Server instance.
Using sqlConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString)
    serverConnection = New ServerConnection(sqlConnection)
    serverConnection.Connect()

    ' Assumes default database in connection string is the database we are trying to query.
    databaseName = sqlConnection.Database
End Using

' Get the DAC info.
Dim dacstore As New DacStore(serverConnection)
Dim dacInstance = dacstore.DacInstances(databaseName)
System.Diagnostics.Debug.Print("Database {0} has Dac pack version {1}.", databaseName, dacInstance.Type.Version)
person Mark    schedule 26.07.2010
comment
Как это сделать программно с помощью DacFx 3.0? Класса DacStore больше нет. - person Mark; 26.05.2015
comment
Похоже, это невозможно в 3.0. См. stackoverflow.com/questions/18499866/ - person Mark; 27.05.2015

В DacFx 3.0 DacStore больше не доступен. Чтобы получить версию из кода C#, вам нужно запросить базу данных. Вот пример:

  using System;
  using System.Data;
  using System.Data.SqlClient;

  class Program
  {
    static void Main()
    {
      try
      {
        string version = GetDatabaseVersion(@"Initial Catalog=xxx;Data Source=yyy;Integrated Security=True;Pooling=False", false);
        Console.WriteLine("Database has DAC pack version {0}.", version);
      }
      catch (Exception ex)
      {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(ex.Message);
        Console.WriteLine();
        Console.ResetColor();
      }
      Console.WriteLine("Press any key to exit");
      Console.ReadKey(true);
    }

/// <summary>
/// Gets the database version.
/// </summary>
/// <param name="connectionString">The connection string of database to query.</param>
/// <param name="isAzure">True if we are querying an Azure database.</param>
/// <returns>DAC pack version</returns>
private static string GetDatabaseVersion(string connectionString, bool isAzure)
{
  var connectionStringBuilder = new SqlConnectionStringBuilder(connectionString);
  string instanceName = connectionStringBuilder.InitialCatalog;
  string databaseToQuery = "msdb";
  if (isAzure)
  {
    // On Azure we must be connected to the master database to query sysdac_instances
    connectionStringBuilder.InitialCatalog = "Master";
    databaseToQuery = "master";
  }

  string query = String.Format("select type_version from {0}.dbo.sysdac_instances WHERE instance_name = '{1}'", databaseToQuery, instanceName);
  using (var connection = new SqlConnection(connectionStringBuilder.ConnectionString))
  {
    connection.Open();
    SqlCommand command = connection.CreateCommand();
    command.CommandText = query;
    command.CommandTimeout = 15;
    command.CommandType = CommandType.Text;
    var version = (string)command.ExecuteScalar();
    return version;
  }
}

}

person Mark    schedule 27.05.2015