Доступ к базе
В технологии Flexberry существуют следующие способы доступа к базе данных:
- Сервис данных. Для чтения данных возможно использование как
- Функции ограничения,
- так и LINQProvider).
- ADO.NET. Позволяет выполнять SQL-запросы из кода.
Примечание: ADO.NET НЕ ИСПОЛЬЗУЕТСЯ в проектах в случаях, когда без него можно обойтись. Даже если возникла острая необходимость использовать ADO.NET, следует проверить, нельзя ли обойтись без него. Возможно, подойдет использование funcSQL.
Если говорить о применимости возможных способов вычитки данных, то: ADO.NET - используется только в случаях, когда не достаточно возможностей сервиса данных.
Формирование запроса в сервисе данных
Из чего складывается текст SQL-запроса, генерируемого сервисом данных:
- Настройки LoadingCustomizationStruct (работу по сортировке, наложению limitFunction, подчёту агрегирующих значений и прочим аналогичным действиям необходимо перекладывать на сервер за счёт задания параметров
LoadingCustomizationStruct. - Атрибутивная разметка (например, атрибут
Storageкак классов, так и связей). - Реализация Inheritance с иcпользованием TypeUsage.
- Перехват запроса к БД.
Если посмотреть, какие запросы отправляет сервис данных на сервер, то в нём встречаются константы типа StormMainObjectKey и STORMJoinedMasterKey.
StormMainObjectKey- первичный ключ (primarykey) объекта, по которому идёт вычитка из базы данных. КонстантаStormMainObjectKeyопределена какICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.StormMainObjectKey.STORMJoinedMasterKey. При организации вычитки из базы данных внешним ключам даются имена по типуSTORMJoinedMasterKey1. ИспользоватьSTORMJoinedMasterKeyпри построении ограничений в коде не рекомендуется, поскольку их порядок может меняться.
ADO.NET
Ниже представлен пример исполнения SQL-запросов через технологию ADO.Net:
var connection = (SqlConnection)((SQLDataService)DataServiceProvider.DataService).GetConnection(); // Получение подключения.
var command = new SqlCommand("SELECT SUM(purchase.\"Сумма\") "+
" FROM \"Покупатель\" customer join \"Покупка\" purchase on customer.\"primaryKey\" = purchase.\"Покупатель\" "+
" WHERE purchase.\"Покупатель\"=@Customer AND purchase.\"Статус\" = \'Оплачено\' ", connection); //формирование запроса
var parameter = new SqlParameter("@Customer", SqlDbType.UniqueIdentifier);
parameter.Value = ((KeyGuid)this.__PrimaryKey).Guid; // Определение значения параметра.
command.Parameters.Add(parameter);
try
{
connection.Open();
var value = (decimal)command.ExecuteScalar(); // Исполнение запроса.
}
finally
{
connection.Close();
}