Форум: "Прочее";
Текущий архив: 2014.03.30;
Скачать: [xml.tar.bz2];
ВнизВозвращение набора данных из Ms sql Найти похожие ветки
← →
Noso (2013-10-07 21:55) [0]База MS SQL, провайдер ADO.
Каким образом можно реализовать такую штуку: вызов хранимой процедуры на сервере, которая вернет такой набор данных ,который на стороне дельфи клиента будет представлен в виде DataSet"а?
Как это сделать?
← →
[ВладОшин] © (2013-10-07 21:58) [1]просто написать select в процедуре
← →
[ВладОшин] © (2013-10-07 22:13) [2]aqGetRsltCompare.Close;
aqGetRsltCompare.sql.text := "exec GetTxtClass :@LevelIgnor ";
aqGetRsltCompare.Parameters.ParamByName("@LevelIgnor").Value := tbrLevelIgn.Position;
aqGetRsltCompare.Open;
------
процедура
ALTER PROCEDURE [dbo].[GetTxtClass]
@LevelIgnor int
AS
BEGIN
SET NOCOUNT ON;
select
и т.п.
← →
[ВладОшин] © (2013-10-08 08:27) [3]причем, можно написать более одного селекта и переключаться м/д ними (через nextrecordset)
Вот это реально удобно.
← →
Noso (2013-10-08 19:06) [4]Что то я в шоке. Результат всех select"ов в хранимке передается на клиента?! А если я тупо делаю вспомогательный селект для поиска промежуточного данного и дальнейшего выполнения хранимки, зачем его на клиента передавать?! Это и по трафику может оказаться чересчур..
← →
Inovet © (2013-10-08 19:08) [5]> [4] Noso (08.10.13 19:06)
Он на сервере и выполнится.
← →
Noso (2013-10-08 20:17) [6]
> Он на сервере и выполнится.
кто он? Запрос? Понятное дело, а результаты на клиент вернутся. Но я не понимаю зачем все?
Стоит в хранимке написать:
...select 1 as my_field;
...
и в датасете на клиенте из примера [2] можно наблюдать запись с полем My_field и значением "1".
Или ты что имел в виду? Или ты с MS SQL не работал и просто так вклинился?
← →
vuk © (2013-10-08 20:29) [7]to Noso (08.10.13 20:17) [6]:
> Стоит в хранимке написать:...select 1 as my_field;
Начинать надо с вопроса - а зачем там это писать?
> и в датасете на клиенте из примера [2] можно наблюдать запись
> с полем My_field и значением "1".
Именно так, операция возвращающая данные, отдаст эти данные клиенту.
← →
sniknik © (2013-10-08 20:35) [8]> зачем его на клиента передавать?!
не зачем, поэтому не пиши "тупо", если нужен "поиск вспомогательного" то пиши запрос на поиск... если нужна запись и не одна (перебор) делай курсор. и т.д. или думаешь в mssql единственная конструкция, или все работает одинаково...
> Стоит в хранимке написать:
и зачем так писать? это же запрос "на выдачу", пиши так select @i = 1, так и использовать можно и в клиент не передастся (вернее... данных точно не будет, а рекордсет с инфой о выполнении ("хедеры") отключается вышеприведенной [2] командой, по умолчанию будет)
> Или ты с MS SQL не работал и просто так вклинился?
сам то работал? или пару запросов написал и уже асом себя чуствуешь?
← →
Noso (2013-10-08 20:41) [9]
> операция возвращающая данные, отдаст эти данные клиенту.
ну вот у меня и разрыв шаблона. Я привык, что данные возвращаются на клиента через какие-то явные операторы...
А если выполнить "просто" select то эти данные возвращаются в код на сервере.. Впрочем, как я понимаю... например:DECLARE @my_id int;
...
select @my_id = id from my_table where id = 1
в этом случае результат select"а не будет отослан на клиент? А просто произойдет присваивание локальной переменной?
← →
Ega23 © (2013-10-08 21:37) [10]
> в этом случае результат select"а не будет отослан на клиент?
> А просто произойдет присваивание локальной переменной?
Да, но не совсем. Присваивание - это set
declare @x int;
set @x=1;
select @x=1 - это аналог выборки из dual или $rdb.database
Но результат что в первом что во втором случае будет сидеть в переменной @x
Если хочешь его вовне выплюнуть -
select x = @x или select @x as x (это равновозможные варианты записи)
Если не хочешь нотификацию по присвоению получать - set nocount on, тогда при всех этих локальных селектах не будет передаваться информация сколько "rows affected"
← →
vuk © (2013-10-08 22:48) [11]to Ega23 © (08.10.13 21:37) [10]:
> Да, но не совсем. Присваивание - это set
В принципе select @x = 1 и set @x = 1 дадут одинаковый результат с точки зрения того, что содержится в @x. Но с другой, select удобнее, когда нужно изменить значения сразу нескольких переменных. Ну и надо понимать, что set, в отличие от select не влияет на значение @@rowcount.
← →
Ega23 © (2013-10-09 00:21) [12]
> В принципе select @x = 1 и set @x = 1 дадут одинаковый результат
> с точки зрения того, что содержится в @x. Но с другой, select
> удобнее, когда нужно изменить значения сразу нескольких
> переменных. Ну и надо понимать, что set, в отличие от select
> не влияет на значение @@rowcount.
Ну да, я это и имел ввиду.
Может коряво объяснил.
← →
[ВладОшин] © (2013-10-09 08:12) [13]- Доктор, если я вот так делаю - у меня вот тут болит..
- Не делайте так. Следующий!
← →
sniknik © (2013-10-09 09:51) [14]> я вот так делаю
бьет молотком по пальцу...
> - Не делайте так. Следующий!
совершенно правильный совет, а ваше решение в такой ситуации?
← →
[ВладОшин] © (2013-10-09 10:02) [15]Да такое же, что тут говорить - все правильно сказали.
Возврат любого селекта как ds - это фишка, а не проблема.
← →
Ega23 © (2013-10-09 10:18) [16]
> Возврат любого селекта как ds - это фишка, а не проблема.
Спорный вопрос. Лучше бы по-умолчанию nocount включен был. А вот когда требуется (честно говоря, я с трудом могу представить, зачем надо) - тогда включался.
← →
vuk © (2013-10-09 10:24) [17]to Ega23 © (09.10.13 10:18) [16]:
> Лучше бы по-умолчанию nocount включен был.
Не вижу какой-либо проблемы в этом. У нас, например, любая процедура начинается с set nocount on
← →
Ega23 © (2013-10-09 10:41) [18]
> Не вижу какой-либо проблемы в этом. У нас, например, любая
> процедура начинается с set nocount on
Дык и у меня тоже начиналось именно с этого.
Согласись, было бы лучше, если бы было наоборот. Ну, в смысле, что он всегда включен, по-умолчанию. А вот если надо, то тогда и писать set nocount off
← →
vuk © (2013-10-09 14:02) [19]to Ega23 © (09.10.13 10:41) [18]:
> Ну, в смысле, что он всегда включен, по-умолчанию.
Угу. А потом кто-то напишет nocount off и вызовет процедуру с кучей обработки, где не написали nocount on. Именно поэтому явное выставление нужной опции - правильно.
← →
Ega23 © (2013-10-09 14:31) [20]
> Угу. А потом кто-то напишет nocount off и вызовет процедуру
> с кучей обработки, где не написали nocount on. Именно поэтому
> явное выставление нужной опции - правильно.
Ну я точно с таким же успехом могу сказать, что кто-то забудет nocount on поставить.
Палка о двух концах, в общем.
КМК, все эти nocount, identity_insert, ansi_defaults и т.п. - это сродни дельфийским директивам компилятора. Ну всякие там {$H+}, {$M-}.
И (опять же, как мне кажется), это надо умолчания в настройки сервера вводить, а дальше в рамках своих скриптов включать-выключать по потребности.
← →
vuk © (2013-10-09 14:43) [21]to Ega23 © (09.10.13 14:31) [20]:
> это надо умолчания в настройки сервера вводить, а дальше
> в рамках своих скриптов включать-выключать по потребности.
>
И всё равно придется всё прописывать явно в процедуре. Чтобы работало как надо вне зависимости от настройки на сервере. Такие дела. :)
← →
Ega23 © (2013-10-09 14:57) [22]
> И всё равно придется всё прописывать явно в процедуре. Чтобы
> работало как надо вне зависимости от настройки на сервере.
> Такие дела. :)
Да я понимаю. Просто хотелось бы что-то аналогичное дельфийским настройкам.
Никто же не стонет за переносимость pas-файлов. Хотя все эти вещи можно в конкретном IDE перенастроить по своему желанию.
← →
ТимоховД (2013-10-09 16:13) [23]
> Никто же не стонет за переносимость pas-файлов
всякое бывает. загрузишь *.pas от уважаемых людей, а он range check error дает, т.к. предполагается, что он отключен должен быть.
поэтому, если закладываешься на что-то (не полное булево вычисление, или преднамеренный range check error или переполнение интежера), то я всегда ключики под uses ставлю в начале модуля.
← →
ТимоховД (2013-10-09 16:13) [24]
> Никто же не стонет за переносимость pas-файлов
всякое бывает. загрузишь *.pas от уважаемых людей, а он range check error дает, т.к. предполагается, что он отключен должен быть.
поэтому, если закладываешься на что-то (не полное булево вычисление, или преднамеренный range check error или переполнение интежера), то я всегда ключики под uses ставлю в начале модуля.
← →
Ega23 © (2013-10-09 16:27) [25]
> поэтому, если закладываешься на что-то (не полное булево
> вычисление, или преднамеренный range check error или переполнение
> интежера), то я всегда ключики под uses ставлю в начале
> модуля.
Ну правильно. Просто, например, полное булево вычисление - ну это такая, довольно экзотическая вестч. Тот же vcl совершенно небезопасен для такой опции, полно мест, типа
if (DataSource <> nil) and (DataSource.DataSet <> nil) then
....
И AV при полном вычислении.
Но ты же не будешь в каждый свой юнит пихать {$B-}, закладываясь на то, что "а вдруг у кого-то B+ включено?".
ИМХО, с nocount off ровно такая же история.
← →
[ВладОшин] © (2013-10-09 16:50) [26]Ну, некоторые извращаются и в "if A and B " в B вкладывают логирование :)
в итоге часть лога не пишется
← →
vuk © (2013-10-10 13:55) [27]to Ega23 © (09.10.13 16:27) [25]:
> Но ты же не будешь в каждый свой юнит пихать {$B-}, закладываясь
> на то, что "а вдруг у кого-то B+ включено?".
Если это вдруг окажется не директивой компилятора (которая после компиляции не изменится уже) а неким глобальным флагом, который может быть изменен другим кодом - именно, что так и будешь себя вести.
← →
Ega23 © (2013-10-10 14:07) [28]
> который может быть изменен другим кодом
Пардон, а как может быть изменена nocount другим кодом?
← →
vuk © (2013-10-10 14:44) [29]to Ega23 © (10.10.13 14:07) [28]:
> Пардон, а как может быть изменена nocount другим кодом?
Насколько помню, для nocount действует то значение, которое было установлено последним в контексте соединения. Допустим, есть процедура, у которой не прописан set nocount. Тогда, если её вызывать из процедуры, где это прописано, вывод будет соответствовать тому, как оно прописано в вызывающей процедуре.
← →
Ega23 © (2013-10-10 14:50) [30]
> Насколько помню, для nocount действует то значение, которое
> было установлено последним в контексте соединения. Допустим,
> есть процедура, у которой не прописан set nocount. Тогда,
> если её вызывать из процедуры, где это прописано, вывод
> будет соответствовать тому, как оно прописано в вызывающей
> процедуре.
Эммм....
Мне казалось, что в рамках ХП.
Правда вот сервера нет, чтоб проверить...
← →
Noso (2013-10-10 20:25) [31]vuk прав полюбас.
Это же значение устанавливается для сессии. Какое есть - такое есть.
И по умолчанию можно изменить, но все равно в каждой процедуре MS SQL пишут эту директиву, даже студия MS SQL при создании хранимки по умолчанию включает этот код с set count off.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2014.03.30;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.002 c