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

Доступ к базе

В технологии 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:

public virtual decimal СуммаОплаченныхПокупок
{
	get
	{
		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();
		}
		
		return value;
	}
	//...
}