Работа с данными

Язык запросов

Поиск данных выполняется с помощью функций Query, QuerySimple, QueryObject:

void Query(string query, Message message);
void QuerySimple(string query, Message message);
void QueryObject(string query, Message message);
void Query(string query, PropertiesCollection parameters, Message message);
void QuerySimple(string query, PropertiesCollection parameters, Message message);
void QueryObject(string query, PropertiesCollection parameters, Message message);
void Query<T>(string query, IList<T> resultList);
void QuerySimple<T>(string query, IList<T> resultList);
void QueryObject<T>(string query, IList<T> resultList);
void Query<T>(string query, PropertiesCollection parameters, IList<T> resultList);
void QuerySimple<T>(string query, PropertiesCollection parameters, IList<T> resultList);
void QueryObject<T>(string query, PropertiesCollection parameters, IList<T> resultList);

где

  • string query: строка запроса.

  • PropertiesCollection parameters: параметры, передаваемые во WHERE.

  • IList<T> resultList или Message message: переменная, содержащая результаты поиска.

Batch-методы

Для выполнения нескольких запросов в одном вызове реализованы методы Batch.

void QueryBatch(string query, PropertiesCollection parameters, params System.Collections.IList[] resultList)
void QueryObjectBatch(string query, PropertiesCollection parameters, params System.Collections.IList[] resultList)
void QuerySimpleBatch(string query, PropertiesCollection parameters, params System.Collections.IList[] resultList)

где

  • string query: все запросы, разделенные с помощью GO.

    Примечание

    В строке запроса поддерживается только конструкция SELECT.

  • PropertiesCollection parameters: коллекция параметров, передаваемых в WHERE. Параметры заполняются в виде коллекции пар имя → значение простого типа. В запросе эти параметры используются как @paramName.

Пример заполнения parameters

var Переменная = new ЛичныйТип();
Переменная.Строка = "строка в типе";
Переменная.Число = 123;

PropertiesCollection parameters = new PropertiesCollection();
parameters.Add("Dep", 12);
parameters.Add("Reg", "EU");
parameters.Add("Text", Переменная.Строка);
parameters.Add("Number", Переменная.Число);
  • IList<T> resultList: переменные, содержащие результаты поиска.

    Внимание

    resultList должен содержать столько же переменных для получения результата, сколько запросов, разделенных GO, указано в query.

QueryBatch:

  1. Возвращает наборы объектов (каждый SELECT → список объектов).

  2. SELECT может вернуть много строк.

  3. Число SELECT = число списков-результатов.

string ТекстЗапроса = @"

SELECT Наименование, Код, Курс
FROM Валюта WHERE Наименование LIKE 'Рубль'

GO

SELECT Наименование, Код, Курс
FROM Валюта WHERE Код = '3'

";

 PropertiesCollection Параметры = new PropertiesCollection();

 DataBank.QueryBatch(ТекстЗапроса, Параметры, ВалютаРезультат1, ВалютаРезультат2);

QuerySimpleBatch:

  1. Возвращает простые типы (int/bool/string/decimal/date/guid).

  2. Каждый SELECT должен вернуть один столбец простого типа.

  3. Число SELECT = число списков.

string ТекстЗапроса = @"

SELECT Инт FROM Core6409 WHERE Бул = 'true'

GO

SELECT Бул FROM Core6409 WHERE Инт = '2'

GO

SELECT Стр FROM Core6409 WHERE Инт = '3'

GO

SELECT Дец FROM Core6409 WHERE Стр = 'четыре'

GO

SELECT Дат FROM Core6409 WHERE Бул = 'false'

GO

SELECT Гуи FROM Core6409 WHERE Инт > '2'

";

 PropertiesCollection Параметры = new PropertiesCollection();

 DataBank.QuerySimpleBatch(ТекстЗапроса, Параметры, Числа, Булеаны, Строки, Децималы, Даты, Гуиды);

QueryObjectBatch:

  1. Возвращает по одному объекту на SELECT.

  2. Каждый SELECT должен вернуть ровно одну строку.

  3. Число SELECT = число объектов-результатов.

var Переменная = new ЛичныйТип();
Переменная.Число = 123;

string query = @"
SELECT TOP 1 Object FROM Employee WHERE Id = @Id1

GO

SELECT TOP 1 Object FROM Contractors WHERE Id = @Id2
";

PropertiesCollection parameters = new PropertiesCollection();
parameters.Add("Id1", "100");
parameters.Add("Id2", Переменная.Число);

DataBank.QueryObjectBatch(query, parameters, EmployeeObj, ContractorObj);

Особенности поиска

Указание таблицы в FROM

В настоящее время поддерживаются в качестве имени таблицы только имена типов 1 уровня(указание вложенных таблиц в FROM не реализовано).

Например, следующий запрос не будет выполнен:

SELECT ГородМассив.Object AS Город FROM Контрагент.ГородМассив AS ГородМассив

Указание полей и таблиц

Поля и таблицы без алиасов могут быть указаны, если они однозначны.

Примеры:

SELECT Имя AS Имя FROM Контрагент AS Контрагент
SELECT Имя AS Имя FROM Контрагент
SELECT Имя FROM Контрагент

Выборка .Object

Может быть использовано в операторе SELECT для выборки всех полей типа данных.

Примеры:

SELECT Контрагент.Object FROM Контрагент AS Контрагент
SELECT Контр.Object AS К FROM Контрагент AS Контр
SELECT Контрагент.Object FROM Контрагент AS Контрагент WHERE
Контрагент.EntityId='DD6C0E5A-B1F5-48CE-BEBC-02CC2398F71C'
SELECT Контрагент.Object, Контрагент.EntityId AS Id FROM Контрагент AS Контрагент
WHERE Контрагент.EntityId='DD6C0E5A-B1F5-48CE-BEBC-02CC2398F71C'
SELECT Контрагент.Object, Контрагент.Город.Object AS Город FROM Контрагент AS
Контрагент
SELECT Договор.Object, Договор.Условия.Продажи.Города.Object FROM Договор AS
Договор

Что следует учитывать:

  • используется только в SELECT;

  • это всегда последнее слово в пути;

  • .Object может стоять либо сразу после типа данных, либо после ссылки внутри нужного типа данных (причем у ссылки может быть IsArray=true или false);

  • может быть несколько таких объектов в одном SELECT;

  • результат запроса будет содержать все поля указанного типа данных, как если бы они были переписаны вручную через запятую;

  • можно использовать как с алиасом (через AS), так и без.

Выборка полей в SELECT

Можно указывать пути к любым полям из типа данных:

SELECT Договор.EntityId, Договор.Условия.Покупки.Товары.Название FROM Договор AS Договор
SELECT Договор.Условия FROM Договор AS Договор

Что следует учитывать:

  • можно использовать как с алиасом, так и без;

  • сложные поля разворачиваются в список дочерних полей;

  • ссылки разворачиваются в 2 поля - EntityId и DataTypeId.

Выборка ссылочных полей

Для полей ссылочного типа можно получить представление значения, хранящееся по ссылке, с помощью ключевого слова VIEW.

SELECT VIEW(Контрагент) AS Представление FROM Контрагент AS Контрагент
SELECT VIEW(Контрагент.МестоРегистрации) AS Город FROM Контрагент AS Контрагент
SELECT VIEW(Контрагент.МестоРегистрации.Object) AS Город FROM Контрагент AS Контрагент

В качестве параметра по View может быть передана ссылка или объект (Object).

Представление строится согласно маске в поле Шаблон представления записи на вкладке Портал в типе данных. Если маска не заполнена, в качестве представления будет возвращено значение первого поля типа данных.

Выборка сложных ссылок

Для сложных ссылок (ссылок на несколько разных типов данных) можно указывать дополнительные фильтры по типу или интерфейсу:

SELECT Контрагент.МестоРегистрации.Object AS Город FROM Контрагент AS Контрагент
SELECT Контрагент.МестоРегистрации(Место).Object AS Место FROM Контрагент AS

Контрагент

SELECT Контрагент.МестоРегистрации(Город).Object AS Город FROM Контрагент AS Контрагент
SELECT Контрагент.МестоРегистрации(Город).ИсторияГорода.Object AS Город FROM Контрагент AS Контрагент
SELECT Контрагент.МестоРегистрации(Город).Object AS Город FROM Контрагент AS Контрагент
SELECT Контрагент.МестоРегистрации(Город).ИсторияГорода.Object AS Город FROM Контрагент AS Контрагент

Что следует учитывать:

  • если ничего не указано, будут перебраны все типы данных ссылки;

  • если указан интерфейс, из типов, на которые указывает ссылка, будут выбраны только те, которые реализуют указанный интерфейс;

  • если указан тип данных, будут выбраны только ссылки указанного типа (ссылка становится простой).

Поля в WHERE/OrderBy и прочих выражениях

Пути к полям могут быть указаны в конструкциях WHERE/Order by и т.п.:

SELECT Контрагент.Object, Контрагент.ИНН AS п1, Контрагент.ИНН AS п2, Контрагент.EntityId AS п3 FROM Контрагент AS Контрагент WHERE Контрагент.Город.Название LIKE '%Моск%'

Что следует учитывать:

  • Если последнее поле в пути - ссылка, сравнение будет по ReferenceId этой ссылки без учета DataTypeId.

  • Последним полем в таком пути не может быть сложное поле, так как оно состоит из нескольких полей.

    Сложное поле - это поле типа Сложное поле или Тип данных (с точки зрения банка они идентичны и хранятся одинаково).

Конструкция WHERE IS

В части WHERE для ссылок можно добавлять проверку указания ссылки на нужный тип данных или интерфейс:

SELECT Контрагент.Object AS Город FROM Контрагент AS Контрагент WHERE Контрагент.МестоРегистрации IS (Город)

Что следует учитывать: данная проверка будет заменена на проверку DataTypeId у указанной ссылки.

Joins

SELECT Контрагент.Object,Контрагент.ИНН AS п1, Контрагент2.Город AS п2,
Контрагент2.EntityId AS п3 FROM Контрагент AS Контрагент LEFT JOIN Контрагент AS
Контрагент2 ON Контрагент.Город = Контрагент2.Город

Что следует учитывать:

  • Можно вносить вручную. Поля и таблицы разворачиваются аналогично тому, что написано выше.

  • Могут добавляться автоматически при обращении к массивам / ссылкам и прочим сложносоставным элементам. Автоматически сейчас всегда создается LEFT JOIN.

Конструкция IS

Возможно использование IS без WHERE, например в конструкциях с JOIN:

SELECT Контрагент.Object, Контрагент.ИНН AS п1, Контрагент2.Город AS п2,
Контрагент2.EntityId AS п3 FROM Контрагент AS Контрагент LEFT JOIN Контрагент AS
Контрагент2 ON Контрагент.Город = Контрагент2.Город AND Контрагент.МестоРегистрации
IS (Город)

Обновление данных UPDATE

Для обновления простых полей используется конструкция Update Set:

UPDATE Г SET Г.Название='Новая Москва', Г.Население=100500 FROM Город AS Г
WHERE Г.EntityId='00003000-0000-0000-0000-000000000000'
//или аналогично
UPDATE Город SET Название='Новая Москва', Население=100500 WHERE
EntityId='00003000-0000-0000-0000-000000000000'

Декларация переменных

Простая декларация

DECLARE @var BIGINT
DECLARE @var VARCHAR(200)

Декларация типов данных

DECLARE @var Город
DECLARE @var Место

Декларация с выборкой

DECLARE @Дог = SELECT DATA.Object AS договор FROM Договор AS DATA DECLARE @ArrayWords = SELECT M.Object FROM Местность AS M WHERE M.EntityId = „00000010-0000-0000-0000-000000000000“ DECLARE @arr1=SELECT ARRAY(M.МассивСлов AS МассивСлов) AS Слова FROM Местность AS M WHERE M.EntityId = „00000010-0000-0000-0000-000000000000“

Для всех переменных доступен SELECT:

SELECT @Дог

Пакетное выполнение

Доступно выполнение нескольких запросов в одном обращении, разделенных оператором GO. Результатом запроса будет массив, содержащий два вложенных массива с результатами выборки:

SELECT М.Object AS Жители FROM Местность AS М GO SELECT К.Object AS Кагент
FROM Контрагент AS К

Результатом запроса будет массив с выборкой, с обновленными данными:

UPDATE Г SET Г.Название='Новая Москва', Г.Население=100500 FROM Город AS Г
WHERE Г.EntityId='00003000-0000-0000-0000-000000000000' GO SELECT DATA.Object
FROM Город AS DATA

Дополнительные функции

Проверка на заполненность ссылки

bool ISEMPTYLINK(путь к ссылочному полю)

Пример запроса:

SELECT История.Object AS ИсторииГорода FROM ИсторияГорода AS История WHERE
NOT ISEMPTYLINK(История.ИзвестноеМесто)

Проверка на существование объекта по указанной ссылке

bool ISEXISTS(путь к ссылочному полю)

Пример запроса:

SELECT Контрагент.Object FROM Контрагент AS Контрагент WHERE
isexists(Контрагент.МестоРегистрации)

Возвращает длину строки

NUMBER LEN(поле или строка)

Пример запроса:

SELECT Город.Название AS Название, Город.Население AS Количество,
len(Город.Название) AS Символов FROM Город AS Город WHERE len(Город.Название)=5

Возвращает подстроку от исходной строки

  • str - исходная строка

  • START - индекс начала подстроки

  • lenght - длина подстроки

  • string SUBSTRING(str,START,lenght)

Пример запроса:

SELECT Город.Название AS Название, Город.Население AS Количество,
SUBSTRING(Город.Название,1,1) AS Подстрока FROM Город AS Город WHERE
SUBSTRING(Город.Название,1,1)='К'

Сервисные возможности

Построенные в памяти дерево индексов можно выгрузить для анализа в файл с помощью запроса «toFile={Имя файла}»:

var textQuery = "toFile=1.json";
QueryObject(textQuery, dic, Результат);

Указанный файл будет помещен при выполнении запроса в каталог Банка данных: C:ProgramDataDatareonPlatformCacheDatareonPlatformDataBank.

Предупреждение

Выгружаются ВСЕ построенные деревья с индексом по всем объектам. Не рекомендуется выполнять запрос на большом количестве данных.