Добавление данных с помощью подзапросов. Класс InsertSelect
Glossary Item Box
Общие сведения
Класс Terrasoft.Core.DB.InsertSelect предназначен для построения запросов на добавление записей в таблицы базы данных bpm'online. При этом в качестве источника добавляемых данных используется экземпляр класса Terrasoft.Core.DB.Select (см. "Получение информации из базы данных. Класс Select"). В результате создания и конфигурирования экземпляра Terrasoft.Core.DB.InsertSelect будет построен запрос базу данных приложения в виде SQL-выражения INSERT INTO SELECT.
ВАЖНО
При работе с классом InsertSelect на добавленные записи не применяются права доступа по умолчанию. К таким записям не применены вообще никакие права приложения (по операциям на объект, по записям, по колонкам). Пользовательское соединение используется только для доступа к таблице базы данных.
ВАЖНО
НА ЗАМЕТКУ
После выполнения запроса InsertSelect в базу данных будет добавлено столько записей, сколько вернется в его подзапросе Select.
Класс Terrasoft.Core.DB.InsertSelect
ВАЖНО
НА ЗАМЕТКУ
Полный перечень методов и свойств класса InsertSelect, его родительских классов, а также реализуемых им интерфейсов, можно найти в документации ".NET библиотеки классов ядра платформы".
Конструкторы
- public InsertSelect(UserConnection userConnection) — создает экземпляр класса с указанным UserConnection.
- public InsertSelect(InsertSelect source) — создает экземпляр класса, являющийся клоном экземпляра, переданного в качестве аргумента.
Свойства
Табл. 1. — Основные свойства класса
Свойство | Тип | Описание |
---|---|---|
UserConnection | Terrasoft.Core.UserConnection | Пользовательское подключение, используемое при запросе. |
Source | Terrasoft.Core.DB.ModifyQuerySource | Источник данных |
Parameters | Terrasoft.Core.DB.QueryParameterCollection | Коллекция параметров запроса. |
HasParameters | bool | Определяет, имеет ли запрос параметры. |
BuildParametersAsValue | bool | Определяет, добавлять ли параметры запроса в текст запроса как значения. |
Columns | Terrasoft.Core.DB.ModifyQueryColumnValueCollection | Коллекция значений колонок запроса. |
Select | Terrasoft.Core.DB.Select | Используемый в запросе экземпляр Terrasoft.Core.DB.Select. |
Методы
Табл. 2. — Основные методы класса
Методы | Описание |
---|---|
string GetSqlText() | Возвращает SQL-текст запроса. |
void BuildSqlText(StringBuilder sb) | Формирует текст запроса при помощи экземпляра StringBuilder. |
void ResetCachedSqlText() | Очищает кэшированный текст запроса. |
QueryParameterCollection GetUsingParameters() | Возвращает коллекцию параметров, используемых запросом. |
void ResetParameters() | Очищает коллекцию параметров запроса. |
void SetParameterValue(string name, object value) |
Устанавливает значение для параметра запроса. Параметры:
|
void InitializeParameters() |
Инициализирует коллекцию параметров запроса. |
int Execute() |
Выполняет запрос. Возвращает количество задействованных запросом записей. |
int Execute(DBExecutor dbExecutor) |
Выполняет запрос, используя экземпляр DBExecutor. Возвращает количество задействованных запросом записей. |
InsertSelect Into(string schemaName) InsertSelect Into(ModifyQuerySource source) |
Добавляет в текущий запрос источник данных. Параметры:
|
InsertSelect Set(IEnumerable<string> sourceColumnAliases) InsertSelect Set(params string[] sourceColumnAliases) InsertSelect Set(IEnumerable<ModifyQueryColumn> columns) InsertSelect Set(params ModifyQueryColumn[] columns)
|
Добавляет в текущий запрос набор колонок, в которые будут добавлены значения с помощью подзапроса. Возвращает текущий экземпляр InsertSelect. Параметры:
|
InsertSelect FromSelect(Select subSelect) InsertSelect FromSelect(Query subSelectQuery) |
Добавляет в текущий запрос предложение SELECT. Параметры:
|
Примеры использования
Пакет с конфигурационным веб-сервисом, реализующим приведенные ниже примеры, можно скачать по ссылке.
ВАЖНО
Код в примерах показывает различные способы передачи параметров в запрос. При разработке проекта учитывайте, что в метод Column.Const не следует передавать параметры, контролируемые пользователем, так как это может привести к потенциальным sql-инъекциям.
Пример 1
Получить текст SQL запроса.
public string GetSqlTextExample(string contactName, string accountName) { var result = ""; var id = Guid.NewGuid(); var select = new Select(UserConnection) .Column(Column.Const(contactName)) .Column("Id") .From("Account") .Where("Name").IsEqual(Column.Parameter(accountName)) as Select; var insel = new InsertSelect(UserConnection) .Into("Contact") .Set("Name", "AccountId") .FromSelect(select); result = insel.GetSqlText(); return result; }
Пример 2
Добавить контакт с указанными именем и названием контрагента.
public string InsertContactWithAccount(string contactName, string accountName) { contactName = contactName ?? "Unknown contact"; accountName = accountName ?? "Unknown account"; var id = Guid.NewGuid(); var select = new Select(UserConnection) .Column(Column.Const(contactName)) .Column("Id") .From("Account") .Where("Name").IsEqual(Column.Parameter(accountName)) as Select; var insel = new InsertSelect(UserConnection) .Into("Contact") .Set("Name", "AccountId") .FromSelect(select); var affectedRows = insel.Execute(); var result = $"Inserted new contact with name '{contactName}'" + $" and account '{accountName}'." + $" Affected {affectedRows} rows."; return result; }
Пример 3
Добавить контакт с указанным имененем, связав его со всеми контрагентами.
public string InsertAllAccountsContact(string contactName) { contactName = contactName ?? "Unknown contact"; var id = Guid.NewGuid(); var insel = new InsertSelect(UserConnection) .Into("Contact") .Set("Name", "AccountId") .FromSelect( new Select(UserConnection) .Column(Column.Parameter(contactName)) .Column("Id") .From("Account") as Select); var affectedRows = insel.Execute(); var result = $"Inserted {affectedRows} new contacts with name '{contactName}'"; return result; }