понедельник, 23 апреля 2012 г.

Дополнения и плагины в C# .NET Framework 3.5

Добрый день читатели, я в этой статье не буду заострять внимание на теории дополнений. Все и так знают что такое плагины. Перейдем сразу к практике.


Мы создадим простое Windows Forms приложение, для которого мы потом сделаем дополнение. Дополнение будет иметь свои формы Windows Forms.


1. Создадим новое решение, назовем его AddInTest



2. Переименум проект в HostApplication



3. Добавим библиотке несколько библиотек классов, назовем их:
AddInSideAdapter, AddInView, Contract, HostSideAdapter, HostView.
Должно получиться как на картинке ниже:


4. Начнем с того, что мы обозначим интерфейс для всех дополнений. Каждое дополнение для нашего приложения должно будет поддерживать этот интерфейс.

5. Откроем проект Contract.
6. Удалим из этого проекта класс Class1.
7. Добавим в проект интерфейс, назовем его IExecutionContract

 




8. Добавим ссылку на сборку System.AddIn.Contract



9. Добавим в блок using System.AddIn.Pipeline и using System.AddIn.Contract;
10. Пометим наш интерфейс атрибутом [AddInContract]
11. Для простоты примера, опишем в интерфейсе всего 1 метод ShowForm.
12. Наш интерфейс должен наследовать интерфейс IContract. Этот интерфейс находится в сборке System.AddIn.Contract; 



  
12. На этом наш интерфейс готов. Перейдем к проекту AddInView.
13. Переименуем класс Class1 в ShowFormAddInView.
14. Добавим ссылку на сборку System.AddIn
15. Добавим в блок using System.AddIn.Pipeline
16. Пометим наш абстрактный класс атрибутом [AddInBase]
17. Создадим абстрактный метод ShowForm.

 

18. С этим пока всё. Перейдем к проекту AddInSideAdapter.
19. Переименуем класс Class1 в ShowFormViewToContractAdapter20. Добавим ссылку на сборку System.AddIn, System.AddIn.Contract, Contract и AddInView
21. Добавим в блок using System.AddIn.Pipeline
22. Пометим наш абстрактный класс атрибутом [AddInAdapter]
23. Обозначим, что наш класс ShowFormViewToContractAdapter наследует интерфейсы ContractBase и Contract.IExecutionContract.
24. Далее опишем класс как показано ниже:


25. Добавим новую библиотеку классов, назовем её ShowFormAddIn
26. Добавим ссылку на сборку System.AddIn
27. Переименуем Class1 в ShowFormAddIn.

28. Добавим в этот проект форму Form1.
29. Все остальное напишем как на рисунке ниже.

 



30. Откроем проект HostView.
31. Переименуем класс Class1 в ShowFormHostView.
32. Напишем следующий код:



33. Откроем проект HostSideAdapter. Добавим ссылку на System.AddIn, System.AddIn.Contract, HostView, Contract.
34. Переименуем класс Class1 в ShowFormContractToViewHostAdapter.
35. Код этого класса:



36. Теперь необходимо открыть по-очереди каждый проект, развернуть у него группу Reference и назначить нашим сборкам признак CopyLocal = false. Единственным исключением должен являться проект самого приложения. Но на данном этапе мы никакие ссылки на сборки в него не добавляли.


37. Выберем всё решение (Solution), нажмем на нем правой кнопкой мыши и выберем очистить решение (Clean Solution).

38. Теперь настроим папки. Для использования дополнений и плагинов нам нужно соблюдать требование к структуре папок. Для начала развернем проект HostApplication. Создадим в ней новую папку, назовем её Output.



39. Откроем свойства проекта HostApplication. На вкладке Debug укажем путь (Output path) к новой папке Output.


пятница, 23 декабря 2011 г.

Красивый код Firebird в Visual Studio 2010 (оператор Select)

Я довольно давно уже работаю с Firebird в Visual Studio и хочу поделится с вами примером кода который я постоянно использую, ну возможно с небольшими вариациями. По моему мнению код выглядит достаточно красиво.


Для новичков я расскажу как создать консольное приложение с использованием Firebird:


1. Создаем новое простое консольное приложение. По-умолчанию его код будет выглядеть так:




2. Добавляем ссылку на сборку Firebird:




3. Указываем файл Firebird. Его можно скачать с сайта Firebirdsql.org




4. Дописываем в секции using код:
using FirebirdSql.Data.FirebirdClient;






5. Дописываем код main, так чтобы он принял вид: 

Code Snippet
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Data;
  5. using System.Text;
  6. using FirebirdSql.Data.FirebirdClient;
  7.  
  8. namespace ConsoleApplication1
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             // Строка подключения
  15.             string ConStr = ""; // ваша строка подключения
  16.             using (FbConnection fbc = new FbConnection(ConStr))
  17.             {
  18.                 try
  19.                 {
  20.                     fbc.Open();
  21.                 }
  22.                 catch (Exception ex)
  23.                 {
  24.                     Console.WriteLine(ex.Message,
  25.                         System.IO.Path.GetFileName(
  26.                         System.Reflection.Assembly.GetExecutingAssembly().Location));
  27.                     return;
  28.                 }
  29.  
  30.                 // Транзакция
  31.                 FbTransactionOptions fbto = new FbTransactionOptions();
  32.                 fbto.TransactionBehavior = FbTransactionBehavior.NoWait |
  33.                      FbTransactionBehavior.ReadCommitted |
  34.                      FbTransactionBehavior.RecVersion;
  35.                 FbTransaction fbt = fbc.BeginTransaction(fbto);
  36.  
  37.                 // Создаем простой запрос
  38.                 string SQL = "select * from myTable Where Speed=@Speed";
  39.                 FbCommand fbcom = new FbCommand(SQL, fbc, fbt);
  40.                 fbcom.Parameters.Clear();
  41.                 fbcom.Parameters.AddWithValue("Speed", 100);
  42.  
  43.                 // Создаем адаптер данных
  44.                 FbDataAdapter fbda = new FbDataAdapter(fbcom);
  45.  
  46.                 DataSet ds = new DataSet();
  47.  
  48.                 try
  49.                 {
  50.                     fbda.Fill(ds);
  51.                 }
  52.                 catch (Exception ex)
  53.                 {
  54.                     Console.WriteLine(ex.Message,
  55.                         System.IO.Path.GetFileName(
  56.                         System.Reflection.Assembly.GetExecutingAssembly().Location));
  57.                     return;
  58.                 }
  59.                 finally
  60.                 {
  61.                     fbt.Rollback();
  62.                     fbc.Close();
  63.                 }
  64.  
  65.                 DataTable dt = ds.Tables[0];
  66.  
  67.                 if (dt.Rows.Count == 0) return;
  68.                 for (int i = 0; i < dt.Rows.Count; i++)
  69.                 {
  70.                     DataRow dr = dt.Rows[i];
  71.  
  72.                     if (dr.IsNull("ID") == false)
  73.                     {
  74.                         // необходимые действия
  75.                         Int32 id = Convert.ToInt32(dr["ID"]);
  76.                         
  77.                     }
  78.                 }
  79.             }
  80.         }
  81.     }
  82. }






6. Разбор полетов:
6.1 Этот пример не будет работать пока переменной ConStr не будет присвоена реальная строка подключения к базе данных.
6.2 В этом коде предусмотрен блок try-catch при подключении к базе. В случае невозможности установки соединения, программа или текущий метод завершится.
6.3 Блок кода заключен в блок using, что гарантирует высвобождение ресурсов.
6.4 Второй аргумент в методе WriteLine выводит имя текущего файла.
6.5 После подключения начинается транзакция с указанными параметрами.
6.6 Для получения данных через DataSet используется адаптер данных, однако есть возможность использовать FbDataReader, но мне кажется при работе с большими выходными наборами лучше использовтаь именно адаптер данных. Т.к.сразу после заполнения данных адаптером, соединение с базой данных можно закрыть.
6.7 В качестве примера я привел SQL код с одним параметром Speed.
6.8 После любого (ошибочного иди верного) выполнения команды Fill адаптера данных транзакция откатывается и соединение закрывается.
6.9 Возможно после сообщений об ошибках вам будет удобнее добавить команду Console.ReadLin();


Вот такой пример работы с Firebird на базе оператора Select.

воскресенье, 27 ноября 2011 г.

Внедрение поддержки базы данных Firebird 2.5 в Visual Studio 2010

Поддержка Firebird для вашей студии может быть реализована двумя способами: руками или с помощью инсталятора. Инсталяторов не так много, предлагаю воспользоваться этим. Данный инсталятор разрабатывался и проверялся мной лично на Windows Xp и 7.
Для тех, кто привык делать всё руками ниже подробная инструкция.

Я расскажу по пунктам как реализовать в Visual Studio 2010 поддержку баз данных Firebird. В частности в любой редакции Visual Studio можно использовать Firebird, но в редакции Express есть ограничения, которые не позволяют использовать визуальный редактор. Поэтому в этой статье установка на Visual Studio 2010 Express рассматриваться не будет. Подразумевается что сервер базы данных Firebird уже установлен на ваш компьютер.

1. Заходим на сайт Firebird, заходим в раздел Download, выбираем NET Provider. Или можно просто перейти по этой ссылке.
1.1 Скачиваем архив NETProvider-2.6.5.zip
1.2 Скачиваем архив FirebirdDDEXProvider-2.0.5.zip

2. Распаковываем архивы
3. Необходимо установить сборки Firebird в GAC, причем в Windows 7 это сложнее чем в Windows XP.
2.1 В Windows XP нажимаем ПУСК-> Выполнить, вводим ASSEMBLY, нажимаем Enter. Перетаскаваем файлы в окно Assembly.
2.2 В Windows 7 открываем меню пуск в командное окно вводим CMD.
2.2.1 Вводим команду chdir "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools"


Если ваша ОС установлена на другой диск, скорректируйте путь.

2.2.2 Устанавливаем в GAC сборку FirebirdSql.Data.FirebirdClient.dll.
Для этого вводим команду gacutil -i "D:\VISUAL STUDIO PROJECTS\Firebird\NETProvider-2.6.5\FirebirdSql.Data.FirebirdClient.dll"


2.2.3 Устанавливаем в GAC сборку FirebirdSql.Data.FirebirdClient.dll.
Для этого вводим команду gacutil -i "D:\VISUAL STUDIO PROJECTS\Firebird\FirebirdDDEXProvider-2.0.5\FirebirdSql.VisualStudio.DataTools.dll"


2.2.4 Установка dll завершена.

3. Теперь нужно отредактировать файл machine.config, в моем случае он находится по пути: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config

4. Открываем этот файл блокнотом

5. Находим секцию
<configuration>
  <configsections>

6. Добавляем строчку:
<section name="firebirdsql.data.firebirdclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

7. Прокручиваем вниз до секции:
<system.data>
    <dbproviderfactories>

8. Добавляем в эту секцию строчку:
<add description=".Net Framework Data Provider for Firebird" invariant="FirebirdSql.Data.FirebirdClient" name="FirebirdClient Data Provider" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c">

9. Сохраняем файл. Всё это действительно для версии 2.6.5

10. Открываем файл D:\VISUAL STUDIO PROJECTS\Firebird\FirebirdDDEXProvider-2.0.5\reg_files\VS2010\FirebirdDDEXProvider64.reg блокнотом.

11. Находим строчку, которая содержит %path% и меняем его на полный путь к файлу  FirebirdSql.VisualStudio.DataTools.dll

"CodeBase"="D:\\VISUAL STUDIO PROJECTS\\Firebird\\FirebirdDDEXProvider-2.0.5\\FirebirdSql.VisualStudio.DataTools.dll"

12. Сохраняем этот файл, запускаем его. На запрос добавить информацию в реестр нажимаем ДА.

13. Установка завершена.

14. Запускаем Visual Studio.

15. Создаем новый проект Windows Forms.

16. Добавляем данные в проект.








Как видите всё работает. Осталось нажать ОК. И создастся типизированный набор данных для базы данных.

Работа далее ни чем не отличается от работы с любой другой базой данных.