Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1373483247
Меломан
2013-07-10 23:07
2014.03.30
Синтезатор на ПК


4-1268982928
z2000
2010-03-19 10:15
2014.03.30
FileExists - дает диалог в XP


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


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский