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

by Admin 26. апреля 2009 18:33

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

using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer;
using Microsoft.SqlServer.Management.UI.VSIntegration;
using System.Text.RegularExpressions;

namespace MySSMSAddin

{
    public class Connect : IDTExtensibility2

      {
        private AddIn _addInInstance;
        private HierarchyObject _tableMenu = null;

        //меню нашей надстройки будет на уровне сервера
        private Regex _tableRegex = new Regex(@"^Server\[[^\]]*\]$");

        //значение для меню уровня БД: @"^Server\[[^\]]*\]/Database\[[^\]]*\]$"
        //или, например, уровня таблицы: @"^Server\[[^\]]*\]/Database\[[^\]]*\]/Table\[[^\]]*\]$"

        public Connect()
            {

            }

            public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
            {
                  _addInInstance = (AddIn)addInInst;
            IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer();
            IObjectExplorerEventProvider provider = (IObjectExplorerEventProvider)objectExplorer.GetService(typeof(IObjectExplorerEventProvider));
            provider.SelectionChanged += new NodesChangedEventHandler(Provider_SelectionChanged);
            }
        private void Provider_SelectionChanged(object sender, NodesChangedEventArgs args)
        {
            INodeInformation[] nodes;
            int nodeCount;
            IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer();
            objectExplorer.GetSelectedNodes(out nodeCount, out nodes);
            INodeInformation node = (nodeCount > 0 ? nodes[0] : null);

            if (_tableMenu == null &&
                _tableRegex.IsMatch(node.Context))
            {
                _tableMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));
                MenuItem item = new MenuItem();
                _tableMenu.AddChild(string.Empty, item);
            }
        }
            public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
            {
            }

            public void OnAddInsUpdate(ref Array custom)
            {

            }

            public void OnStartupComplete(ref Array custom)
            {

            }

            public void OnBeginShutdown(ref Array custom)
            {

            }

      }

}

 

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer;

namespace MySSMSAddin
{
    public class MenuItem : ToolsMenuItemBase, IWinformsMenuHandler
    {
        public MenuItem()
        {
            //Создаём меню "MyTestAddIn"
            this.Text = "MyTestAddIn";
        }

        protected override void Invoke()
        {

        }

        public override object Clone()
        {
            return new MenuItem();
        }

        #region IWinformsMenuHandler Members

        public System.Windows.Forms.ToolStripItem[] GetMenuItems()
        {
            ToolStripMenuItem item = new ToolStripMenuItem("MyTestAddIn");

            //Подменю будет с названием "ConnectionString"
            ToolStripMenuItem ConnectionString = new ToolStripMenuItem("ConnectionString");

            ConnectionString.Tag = false;
            ConnectionString.Click += new EventHandler(ConnectionStringItem_Click);
            item.DropDownItems.Add(ConnectionString);

            return new ToolStripItem[] { item };
        }

        #endregion

        void ConnectionStringItem_Click(object sender, EventArgs e)
        {
            //Выводим строку коннекции к выбранному серверу БД
            MessageBox.Show(this.Parent.Connection.ConnectionString,
               "ConnectionString",
                MessageBoxButtons.OK,
                MessageBoxIcon.Information);
        } 

    }

}

 

 

В References добавим два компонента .Net: System.Windows.Forms и System.Drawing

Вот теперь точно ВСЁ!!!

 

Компилируем наш проект и запускаем установщик:

 

 

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

 

 

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

 

 

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

 

 

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

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

 

Скачать исходный код данного проекта - MySSMSAddin.rar


Ссылки по данной теме:

 

Tags: , , , ,

SQL Server

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading