Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Результат Query, как вернуть? 
V
    Опции темы
Mephisto
Дата 11.7.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Люди, как вернуть результат Query, если например запрос был:
Код

Print 'Tratata'
  

Это сообщение отредактировал(а) Mephisto - 11.7.2006, 18:27
PM   Вверх
DimW
Дата 12.7.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Я так понимаю речь о том можно ли при помощи TQuery выполнить процедурный код?! Ответ: нет! Для этого компонента обязательной конструкцией запроса является блок select ... from ... 
Если же все таки цель вернуть 'Tratata', то к примеру в оракл это делается просто:
Код

select 'Tratata'
from dual
 
PM MAIL ICQ   Вверх
Mephisto
Дата 12.7.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



На самом деле проще даже написать 
Код

Select 'Tratata'

Результат тот же.
Но это не совсем то что меня интересует. Если у тебя стоит MS SQL, то можно в командной строке написать следующий код:
Код

osql -E -q "print 123"

Данная штучка выдаст на экран 123, но это будет не запись в таблице, а что-то типа комментария.

Цитата(DimW @  12.7.2006,  08:19 Найти цитируемый пост)
можно ли при помощи TQuery выполнить процедурный код?! Ответ: нет! 

На самом деле не вопрос. Выполняет что угодно. Нужно только вместо Open писать ExecSQL. У меня прросто процедуры по ходу своего выполнения высыпают много комментариев с детальным олгом того что сотворили. Мне нужно это читать в результате. Даже с консоли это возможно. Неужели со стандартных компонентов нельзя читать?  smile  
PM   Вверх
DimW
Дата 12.7.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Все понял! речь о том что бы в режиме РЕАЛЬНОГО ВРЕМНИ показывать на каком этапе выполняется процедура.

Цитата(Mephisto @  12.7.2006,  09:39 Найти цитируемый пост)
Если у тебя стоит MS SQL


не стоит, буду пробывать на оракл, но что то мне подсказывает, что если даже удасться получить то что там сервер нагкнерил, то все равно все эти логи вернутья после завершения всей процедуры.
 
PM MAIL ICQ   Вверх
Mephisto
Дата 12.7.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Цитата(DimW @  12.7.2006,  09:42 Найти цитируемый пост)
Все понял! речь о том что бы в режиме РЕАЛЬНОГО ВРЕМНИ показывать на каком этапе выполняется процедура.

Не совсем. Он в любом случае возвращает только после завершения всей транзакции.

У меня очень сложная процедура. И есть необходимость вести лог по всем добавлениям в базу. Тобишь один курсор проходя по таблице в зависимости от данных находящихся в конкретной записи запускает разные процедуры. Это он выводит через принт. Мне необходимо показать что и для какой записи он сделал. Это выклядит как (пример)

Для тратата1 создано 3 записи в ппп (дата и время)
для тратата2 перенесено ... в ... (дата и время)
...

И.т.д.  
PM   Вверх
Vit
Дата 13.7.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Print перехватить невозможно. Я использую таблицу и периодитески делаю в неё Insert с указанием нужного сообщения. Любой другой процесс может прочитать что происходит из таблицы 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Mephisto
Дата 13.7.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Цитата(Vit @  13.7.2006,  17:15 Найти цитируемый пост)
Print перехватить невозможно. Я использую таблицу и периодитески делаю в неё Insert с указанием нужного сообщения. Любой другой процесс может прочитать что происходит из таблицы 

Спасибо. Вот и я пришел к такому выводу. 
Жаль конечно. Было б удобно. 
PM   Вверх
Mephisto
Дата 15.7.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Да уж. Чет я провтыкал.  smile  
PM   Вверх
SergeBS
Дата 17.7.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Vit
Одну строчку print перехватить можно. Т.е. типа
select bla-bla-bla
if bum-bum-bum
 print 'Hihihi'
else
 print 'ohoho'

а вот несколько, типа
select bla-bla-bla
if bum-bum-bum
  begin
   print 'Hihihi'
   print 'hohoho'
  end
else
  begin
     print 'ohoho'
     print 'ooooo'
  end
у меня не получилось (по крайней мере пока). Оно мне (пока) не надо.  
Вот статья:
===========================================================
MS SQL Server 7 Stored Procedure PRINT Statements with ADO  - by Borland Developer Support Staff

    Abstract: How to access the message from an MS SQL Server 7 Stored Procedure

MS SQL Server stored procedures use a number of ways of communicating information back to the user. One of these is the PRINT statement. This statement is typically used for informational type messages. If the intention is to raise an exception in the calling application, it is preferable to use the RAISERROR statement.

Many users want to use the PRINT statement, however, and it has not been possible to access informational type messages with the BDE - only RAISERROR was supported, and then only those errors of sufficient severity to raise an exception.

With ADO it is possible to access PRINT statement messages. ADO considers these messages to be errors of severity 0 - too low to raise an exception - but nevertheless the messages are written to ADO's errors collection, which, in Delphi, is a property of the TADOConnection component.

Another fact worth pointing out is that Print statement messages are only placed in the Errors collection if the ADO command is executed with the eoExecuteNoRecords Option set to True.

How do we retrieve this message in practice?

Consider the following Stored Procedure:

create PROCEDURE sp_show_test (@param1 char(30)) as
begin
  If (@param1 = "Some Value")
    Select * from dbo.authors
  else
  begin
    print "Illegal value : "+@param1
    return 25
  end
end


This will return a result set if the input parameter is set to "Some Value", otherwise it will issue the "Illegal Value" message and return a user defined return code of 25.

How do we deal with this in Delphi? If we just use a TADODataSet component, we risk getting an exception raised when a result set is not returned by the stored procedure. It is therefore better to use a TADOCommand component AND a TADODataSet. The Execute method of a TADOCommand can return an ADO _RecordSet object, which we can assign to the RecordSet property of the TADODataSet. If the stored procedure does not return a result set, the _RecordSet is still returned but in a closed state, which we can test for.

Here is a simple Delphi unit that allows us to see the Print statement's message. In addition to the three ADO components listed above this code requires a TEdit and TButton, and 'ADOInt' should be added to your uses clause:

procedure TForm1.Button1Click(Sender: TObject);
var
  MyReturn : Integer;
  looper : Integer;
  MyRecordSet : _RecordSet;
begin
  ADOCommand1.Prepared := True;
  ADOCommand1.Parameters.ParamByName('@param1').Value := Edit1.Text;
  MyRecordSet := ADOCommand1.Execute;
  if MyRecordSet.State = adStateOpen then
  begin
    ADODataSet1.Recordset := MyRecordSet;
    ADODataSet1.Open;
  end
  else
  begin
    ADOCommand1.ExecuteOptions := [eoExecuteNoRecords];
    ADOCommand1.Execute;
    MyReturn := ADOCommand1.Parameters.ParamByName('RETURN_VALUE').Value;
    for looper := 0 to ADOConnection1.Errors.Count - 1 do
    begin
      ShowMessage(Format('Stored Procedure %s Failed with Return Code %d and Message "%s"',
                         [ADOCommand1.CommandText,MyReturn,
                         TrimRight(ADOConnection1.Errors[looper].Description)]));
    end;
  end;
end;


As mentioned, when we execute the procedure the first time, we are expecting a result set to be returned. This will mean that the Errors collection will not be filled. If the result set has not been returned, we must execute the procedure a second time with the eoExecuteNoRecords option set.

Add or View comments on this article

Products:
Borland Delphi 5.x

Platforms:
Windows NT 4.0 SP5

Article ID: 20245   Publish Date: December 06, 1999  Last Modified: December 17, 1999
=======================================
По ее идее я нацарапал в свое время простенький тест - прошло, но только для первого print
Пробуйте, если хотите. Тест у меня дома - не забуду - завтра притащу. 
PM MAIL   Вверх
Mephisto
Дата 18.7.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Прикольно. Пасип.  smile  
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0929 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.