Описание способов работы с БД и рекомендуемые способы доступа к БД

Доступ к базе

В технологии Flexberry существуют следующие способы доступа к базе данных:

Примечание: 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();
}