Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.03.30;
Скачать: CL | DM;

Вниз

Возвращение набора данных из 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.007 c
15-1381397783
Ламот
2013-10-10 13:36
2014.03.30
Помогите пож. разобраться с SQL Developer...


9-1194966580
Voland2000
2007-11-13 18:09
2014.03.30
Посчитать количество полигонов в Octree узле


15-1381350602
Юрий
2013-10-10 00:30
2014.03.30
С днем рождения ! 10 октября 2013 четверг


15-1373483247
Меломан
2013-07-10 23:07
2014.03.30
Синтезатор на ПК


6-1272206861
tippa
2010-04-25 18:47
2014.03.30
много подключений с одного сокета