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); |
Служба 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.