SqlService (из пространства имен Ultima.Server.Data) позволяет выполнять произвольные SQL запросы:

// Запрос без параметров.

var sql = @"SELECT DBMS_RANDOM.RANDOM

 FROM DUAL CONNECT BY ROWNUM <= 10";

var randomTable = SqlService.Select(sql);

 

// Запрос с параметрами.

var sql = @"

 SELECT * FROM USER_OBJECTS

 WHERE OBJECT_TYPE = :vType AND STATUS = :vStatus";

var parameters = new Dictionary<string, object>

{

 { "vType", "INDEX" },

 { "vStatus", "VALID" }

};

 

var indexes = SqlService.Select(sql, parameters);

Использование SqlService возможно в отдельной транзакции в рамках одного серверного вызова. В приведенном ниже примере независимо от результатов серверного вызова весь блок внутри using будет зафиксирован в базе как единая операция:

using (var scope = SqlService.BeginTransaction())

{

 var args = new Dictionary<string, object>

 {

         { "vID", id }

 };

 

 var sql = @"DELETE FROM MY_TEST_TABLE WHERE ID = :vID";

 SqlService.Execute(sql, args);

 scope.Complete();

}

Если используется схема с резервным (Standby) сервером СУБД, можно перераспределить часть нагрузки на него. Резервные сервера открыты только для чтения:

using (var db = SqlService.Standby())

{

 // выполнить read-only запрос

}

В некоторых случаях использование SqlService является единственно возможным способом. Так, например, с помощью LINQ запросов нельзя получить новое значение последовательности:

var barcodes = SqlService.GetNewID("STICKER_BARCODE_SEQ");

Кроме того SqlService позволяет работать с временными таблицами:

var tagId = SqlService.FillTempIDList(articleList);

string sql = @"

 SELECT TR.ARTICLE_ID, TR.CCD_ID

 FROM TR_STOCK_CCDS TR

 JOIN KERNEL.TEMP_TAG_IDLIST T

 ON T.ID = TR.ARTICLE_ID and T.TAG = :vTagID

var resultTable = SqlService.Select(sql);

DevBookmark_Scripts Служба SqlService реализует следующие методы:

Select(string sql) – выполняет SQL запрос без параметров, возвращает объект класса SlimTable:

sql – SQL запрос;

Select(string sql, IDictionary<string, object> parameters) – выполняет SQL запрос с заданными параметрами, возвращает объект класса SlimTable:

sql – SQL запрос;

parameters – список параметров для выполнения запроса;

семейство методов Execute, выполняющих SQL запрос:

Execute(string sql) – выполняет SQL запрос без параметров, возвращает число удовлетворяющих запросу записей:

sql – SQL запрос;

Execute(string sql, IDictionary<string, object> parameters) – выполняет SQL запрос с заданными параметрами, возвращает число удовлетворяющих запросу записей:

sql – SQL запрос;

parameters – список параметров для выполнения запроса;

ExecuteScalar – возвращает объект, который находится в первом столбце первой строки в результирующем наборе запроса;

ExecuteScalar<T> – строго типизированный вариант предыдущего метода;

ExecuteList<T> – строго типизированный метод, который возвращает первый столбец результирующего набора запроса;

GetReader(string sql) – выполняет SQL запрос без параметров, возвращает объект класса IDataReader:

sql – SQL запрос;

GetReader(string sql, IDictionary<string, object> parameters) – выполняет SQL запрос с заданными параметрами, возвращает объект класса IDataReader:

sql – SQL запрос;

parameters – список параметров для выполнения запроса;

GetNewID(string sequenceName) – возвращает новый идентификатор для указанной последовательности (sequence):

sequenceName – имя последовательности;

GetNewIDs(string sequenceName, int count) – возвращает заданное число идентификаторов для указанной последовательности (sequence):

sequenceName – имя последовательности;

count – число идентификаторов;

FillTempIDList(IDList values) – заполняет значениями идентификаторов временную таблицу TEMP_TAG_IDLIST. Например, необходимо сгенерировать прайс-лист для большого списка товаров, удовлетворяющего ряду условий сложного запроса: получить данные из нескольких таблиц – название товара, его цену, остаток на складе и т.д. Чтобы не выполнять запрос по выборке товаров при выполнении операции JOIN каждый раз, можно сохранить его во временной таблице. В результате работы метод возвращает тег, который создается автоматически и с которым ассоциируется данный список значений во временной таблице:

values – список идентификаторов для записи;

FillTempIDList(long tag, IDList values) – заполняет значениями идентификаторов временную таблицу TEMP_TAG_IDLIST. Возвращает тег, который также указывается в качестве параметра (тег должен быть уникальным в рамках выполняемой транзакции) и с которым ассоциируется данный список значений:

tag – тег;

values – список идентификаторов для записи;

ExclusiveLock(string guid, string description = null) – получает монопольную блокировку:

guid – уникальный идентификатор блокировки;

description – описание блокировки (опционально);

BeginTransaction() – начинает новую автономную транзакцию, возвращает экземпляр TransactionScope;

Standby() – подключается к одному из из описанных в конфигурации кластера резервных серверов. Резервные сервера открыты только для чтения: на полученном соединении нельзя изменять данные, нельзя даже заполнять временную таблицу. Возвращает объект класса IDisposable.