Свой ADD-IN для SSMS (SQL Server Management Studio) за 10 минут

Источник: t-sql

Что такое ADD-IN? ADD-IN - это надстройка, которую можно создать самим в среде Visual Studio и которая может расширить функционал, который по умолчанию отсутствует в программе.
В конкретно нашем случае я буду делать простенькую надстройку в SQL Server Management Studio 2008. В качестве среды разработки использую Microsoft Visual Studio 2008.

Запускаем Visual Studio 2008 и создаём новый проект: File->New->Project…->Other Project Types->Extensibility->Visual Studio Add-In.


Далее выбираем язык для разработки (Шаг 1):

На 2ом Шаге выбираем приложение, для которого создаётся надстройка:

3 Шаг: Указываем название нашей надстройки и её описание

На 4ом Шаге указываем параметры надстроек:
• Будет ли надстройка выводится в меню Сервис.
• Задайте условия запуска надстройки.
• Будет ли надстройка использовать модальный пользовательский интерфейс или нет. Во втором случае ее можно будет безопасно использовать при построении через командную строку.

Шаг 5 - "Справка, О программе" задайте, должна ли надстройка отображаться в окне Visual Studio "Help About".

После выполнения шагов 1-6 выбранные параметры отображаются для просмотра на странице Сводка. Если все верно, нажмите Готово, чтобы создать надстройку. Если необходимо что-либо изменить, нажмите кнопку Назад.

Заготовка нашей надстройки готова, осталось добавить несколько моментов.

Во-первых: добавим в наш проект Setup Project, для более удобной инсталляции нашей надстройки. File->Add->New Project…->Other Project Types->Setup and Deployment->Setup Project

Добавим в реестр ключ для активизации нашей надстройки при запуске SSMS ( HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\Shell\Addins\ )


Кроме этого необходимо в наш проект добавить Assemblies для SSMS, которые расположены в папках с установленными компонентами SQL Server 2008:
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\
(Microsoft.SqlServer.ConnectionInfo.dll и Microsoft.SqlServer.RegSvrEnum.dll)
и
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\
(Microsoft.SqlServer.SqlTools.VSIntegration.dll и SqlWorkbench.Interfaces.dll)

А в наш Setup Project добавим Project Output…:

При этом возможно "вылетит" предупреждение:

Чтобы в дальнейшем у нас не было с этим проблем и для того, чтобы "облегчить" нашу надстройку, отключим все объекты из Setup Project->Detected Dependencies

А в свойствах Primary output значение Register меняем на vsdrpCom:

Теперь добавим несколько строк в наш класс Connect.cs:

 
01.using System;
02.using Extensibility;
03.using EnvDTE;
04.using EnvDTE80;
05.using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer;
06.using Microsoft.SqlServer.Management.UI.VSIntegration;
07.using System.Text.RegularExpressions;
08.  
09.namespace MySSMSAddin
10.  
11.{
12.    public class Connect : IDTExtensibility2
13.  
14.      {
15.        private AddIn _addInInstance;
16.        private HierarchyObject _tableMenu = null;
17.  
18.        //меню нашей надстройки будет на уровне сервера
19.        private Regex _tableRegex = new Regex(@"^Server\[[^\]]*\]$");
20.  
21.        //значение для меню уровня БД: @"^Server\[[^\]]*\]/Database\[[^\]]*\]$"
22.        //или, например, уровня таблицы: @"^Server\[[^\]]*\]/Database\[[^\]]*\]/Table\[[^\]]*\]$"
23.  
24.        public Connect()
25.            {
26.  
27.            }
28.  
29.            public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
30.            {
31.                  _addInInstance = (AddIn)addInInst;
32.            IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer();
33.            IObjectExplorerEventProvider provider = (IObjectExplorerEventProvider)objectExplorer.GetService(typeof(IObjectExplorerEventProvider));
34.            provider.SelectionChanged += new NodesChangedEventHandler(Provider_SelectionChanged);
35.            }
36.        private void Provider_SelectionChanged(object sender, NodesChangedEventArgs args)
37.        {
38.            INodeInformation[] nodes;
39.            int nodeCount;
40.            IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer();
41.            objectExplorer.GetSelectedNodes(out nodeCount, out nodes);
42.            INodeInformation node = (nodeCount > 0 ? nodes[0] : null);
43.  
44.            if (_tableMenu == null &&
45.                _tableRegex.IsMatch(node.Context))
46.            {
47.                _tableMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));
48.                MenuItem item = new MenuItem();
49.                _tableMenu.AddChild(string.Empty, item);
50.            }
51.        }
52.            public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
53.            {
54.            }
55.  
56.            public void OnAddInsUpdate(ref Array custom)
57.            {
58.  
59.            }
60.  
61.            public void OnStartupComplete(ref Array custom)
62.            {
63.  
64.            }
65.  
66.            public void OnBeginShutdown(ref Array custom)
67.            {
68.  
69.            }
70.  
71.      }
72.  
73.}

 
И создадим новый класс MenuItem.cs(меню нашей надстройки):

 
01.using System;
02.using System.Collections.Generic;
03.using System.Linq;
04.using System.Text;
05.using System.Windows.Forms;
06.using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer;
07.  
08.namespace MySSMSAddin
09.{
10.    public class MenuItem : ToolsMenuItemBase, IWinformsMenuHandler
11.    {
12.        public MenuItem()
13.        {
14.            //Создаём меню "MyTestAddIn"
15.            this.Text = "MyTestAddIn";
16.        }
17.  
18.        protected override void Invoke()
19.        {
20.  
21.        }
22.  
23.        public override object Clone()
24.        {
25.            return new MenuItem();
26.        }
27.  
28.        #region IWinformsMenuHandler Members
29.  
30.        public System.Windows.Forms.ToolStripItem[] GetMenuItems()
31.        {
32.            ToolStripMenuItem item = new ToolStripMenuItem("MyTestAddIn");
33.  
34.            //Подменю будет с названием "ConnectionString"
35.            ToolStripMenuItem ConnectionString = new ToolStripMenuItem("ConnectionString");
36.  
37.            ConnectionString.Tag = false;
38.            ConnectionString.Click += new EventHandler(ConnectionStringItem_Click);
39.            item.DropDownItems.Add(ConnectionString);
40.  
41.            return new ToolStripItem[] { item };
42.        }
43.  
44.        #endregion
45.  
46.        void ConnectionStringItem_Click(object sender, EventArgs e)
47.        {
48.            //Выводим строку коннекции к выбранному серверу БД
49.            MessageBox.Show(this.Parent.Connection.ConnectionString,
50.               "ConnectionString",
51.                MessageBoxButtons.OK,
52.                MessageBoxIcon.Information);
53.        
54.  
55.    }
56.  
57.}

  

В References добавим два компонента .Net:
System.Windows.Forms и System.Drawing
Вот теперь точно ВСЁ!!! Компилируем наш проект и запускаем установщик:

Далее выбираем куда установить нашу надстроечку и кому она будет доступна на данном компьютере (всем или только вам):

Теперь запускаем SQL Server Management Studio, если вы всё сделали верно, указали и зарегистрировали все сборки, то у вас не будит никаких ошибок, иначе, при запуске SSMS, на экране получите ошибку (
Error Message: Class not registered
Error number: 80040154 ):

А при удачной установке в основном меню появилось меню нашей сборки:

Результат работы, которого - это вывод на экран строки подключения для текущего сервера БД:

Таким образом, мы за 10 минут реализовали простейший ADD-IN для SSMS. Удалить настройку можно, как любой другой компонент/программу, установленные на вашем компьютере:


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=22768