Как найти текущую версию приложения уровня данных SQL Server?
Мы используем приложение уровня данных SQL Server (dacpac или DAC), и мне трудно найти текущую версию базы данных.
Есть ли способ получить текущую версию, используя любой из этих методов:
- Из SQL Server Management Studio
- С помощью оператора SQL
- Программно используя код.NET
2 ответа
Из SQL Server Management Studio
С http://msdn.microsoft.com/en-us/library/ee210574.aspx
Чтобы просмотреть сведения о DAC, развернутом в экземпляре компонента Database Engine:
Выберите меню View/Object Explorer.
Подключитесь к экземпляру из панели обозревателя объектов.
Выберите меню View/Object Explorer Details.
Выберите серверный узел в обозревателе объектов, который сопоставляется с экземпляром, а затем перейдите к узлу " Управление \ Приложения уровня данных".
Представление списка в верхней панели страницы сведений содержит список каждого ЦАП, развернутого в экземпляре компонента Database Engine. Выберите ЦАП, чтобы отобразить информацию в области сведений в нижней части страницы.
Меню правой кнопки мыши узла Приложения уровня данных также используется для развертывания нового 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);
VB.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)
В 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;
}
}
}