Свій ADD-IN для SSMS (SQL Server Management Studio) за 10 хвилин, Інші СУБД, Бази даних, статті

Що таке 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):


На Другий Кроці вибираємо додаток, для якого створюється надбудова:


3 Крок: Вказуємо назву нашої надбудови та її опис


На Четверта Кроці вказуємо параметри надбудов:
• Чи буде надбудова виводиться в меню Сервіс.
• Задайте умови запуску надбудови.
• Чи буде надбудова використовувати модальний користувальницький інтерфейс чи ні. У другому випадку її можна буде безпечно використовувати при побудові через командний рядок.


Крок 5 – “Довідка, Про програму” задайте, чи повинна надбудова відображатися у вікні Visual Studio “Help About”.


Після виконання кроків 1-6 вибрані параметри відображаються для перегляду на сторінці Підсумок. Якщо все вірно, натисніть Готово, Щоб створити надбудову. Якщо необхідно щось змінити, натисніть кнопку Назад.


Заготівля нашої надбудови готова, залишилося додати кілька моментів.


По-перше: Додамо в наш проект Setup Project, Для більш зручної інсталяції нашої надбудови. File->Add->New Project…->Other Project Types->Setup and Deployment->Setup Project


Додамо до реєстру ключ для активізації нашої надбудови при запуску SSMS (HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server90ToolsShellAddins )


Крім цього необхідно в наш проект додати Assemblies для SSMS, Які розташовані в папках з встановленими компонентами SQL Server 2008:
C:Program FilesMicrosoft SQL Server100SDKAssemblies
(Microsoft.SqlServer.ConnectionInfo.dll і Microsoft.SqlServer.RegSvrEnum.dll)
і
C:Program FilesMicrosoft SQL Server100ToolsBinnVSShellCommon7IDE
(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. Видалити налаштування можна, як будь-який інший компонент / програму, встановлені на вашому комп’ютері:

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*