Рекурсивная процедура поиска элементов ветки дерева в FireBird и Interbase

Время от времени приходится общаться с СУБД FireBird и Interbase. И вот недавно возникла необходимость поиска и выбора всех вложенных элементов дерева. В моём случае необходимо было удалить все вложенные группы дерева при удалении родительской группы и в дальнейшем организовать поиск всех вложенных элементов.

Удаление можно сделать на триггерах, а вот с поиском так не прокатит. Поэтому используем рекурсивную процедуру выборки. (заранее оговорюсь, рекурсия — это вариант для небольших и не очень нагруженных БД, если база большая и нагрузка на СУБД планируется существенная, то рекурсии лучше избежать, пример того как это можно сделать будет ниже)

Итак, мы имеем таблицу с тремя полями (идентификатор, идентификатор родителя, наименование):
CREATE TABLE TEST_TABLE (
    ID         INTEGER NOT NULL,
    ID_PARENT  INTEGER,
    NAME       VARCHAR(250)
);

Для такой таблицы процедура рекурсивного удаления элемента со всеми вложенными элементами будет выглядеть так:
CREATE PROCEDURE DELETE_NODES (
    ID_NODE INTEGER)
AS
DECLARE VARIABLE ID_KID INTEGER;
begin
  /* Выбираем вложения */
  for select ID from test_table where ID_PARENT = :ID_NODE INTO :ID_KID
    do begin
        /* Запускаем процедуру для всех вложенных групп поочереди (рекурсия) */
        execute procedure delete_nodes(id_kid);
    end
    /* Удаляем группу*/
    delete from test_table where ID = :ID_NODE;

  suspend;
end
Вот и всё, вместо удаления можем делать выборку или изменение данных, всё что угодно.
Читать дальше →

Как в InterBase сделать INSERT нескольких строк одним скриптом

Давно меня интересовал этот вопрос! Как же так сделать? Вставить одним запросом в таблицу несколько строк. Дело в том, что в СУБД InterBase в отличие от множества других СУБД запрос типа:
insert into tabble1
    (param1, param2)
         values
             (1, 'Сидоров'), (2, 'Петров'), (3, 'Иванов');
выполнить, оказывается нельзя.

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

И оказывается есть таки альтернатива!

Вот так это делается:
execute block as begin 
insert into tabble1 (param1, param2) values (1, 'Сидоров');
insert into tabble1 (param1, param2) values (2, 'Иванов');
insert into tabble1 (param1, param2) values (3, 'Петров');
end
Это все отправляется серверу — как один запрос.

Опытным путём выявлено, значительное ускорение вставки данных при использовании такого механизма.

Работа с базой данных FireBird и InterBase из C#

Часто сталкиваюсь с необходимостью взаимодействия различных приложений написанных на .NET с базами данных FireBird и InterBase. Поэтому решил написать пример для памяти, чтобы в следующий раз не искать по собственным исходникам а быстренько заглянуть сюда. Возможно кому-то тоже пригодится.

Итак, чтобы подключиться к базе данных нам потребуется Коннектор: «FirebirdClient-2.5.0-Alpha2.msi» — в моём случае такой, возможно уже есть новее. (вбиваете в поисковике — найдётся).

После установки в Program Files появится папочка FirebirdClient 2.0 — в ней лежат необходимые библиотеки. Добавляем оттуда в наш проект через «Add Reference» библиотеку: FirebirdSql.Data.FirebirdClient.dll

Далее отличий от работы с любыми другими базами данных в .NET, практически нет, пример:
//Подключение к FireBir.
string connectionString = "User=SYSDBA;Password=masterkey;Database=D:\SMDK\DBase\SmarketFood.fdb;DataSource=roman-book;Port=3050;Dialect=3;Charset=WIN1251;Role=;Connection lifetime=30;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;";
FbConnection con = new FbConnection(connectionString);
//Думаю строка подключения хотя и большая но понятная


И далее всё как обычно, стандартный набор Методов:
con.Open();
FbCommand command = new FbCommand("select count(*) from table", con);
con.Close();
//FbDataReader - DataReader. (Всё как обычно работает аналогично)
//FbDataAdapter - DataAdapter. (Точно так-же)


P.S.
FirebirdClient-2.5.0-Alpha2.msi — проверял работает как с FireBird так и с InterBase замечательно работает.