![]() |
|
![]() ![]() ![]() |
|
Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
Люди, как вернуть результат Query, если например запрос был:
Это сообщение отредактировал(а) Mephisto - 11.7.2006, 18:27 |
|||
|
||||
DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
Я так понимаю речь о том можно ли при помощи TQuery выполнить процедурный код?! Ответ: нет! Для этого компонента обязательной конструкцией запроса является блок select ... from ...
Если же все таки цель вернуть 'Tratata', то к примеру в оракл это делается просто:
|
|||
|
||||
Mephisto |
|
||||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
На самом деле проще даже написать
Результат тот же. Но это не совсем то что меня интересует. Если у тебя стоит MS SQL, то можно в командной строке написать следующий код:
Данная штучка выдаст на экран 123, но это будет не запись в таблице, а что-то типа комментария. На самом деле не вопрос. Выполняет что угодно. Нужно только вместо Open писать ExecSQL. У меня прросто процедуры по ходу своего выполнения высыпают много комментариев с детальным олгом того что сотворили. Мне нужно это читать в результате. Даже с консоли это возможно. Неужели со стандартных компонентов нельзя читать? ![]() |
||||
|
|||||
DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 5 Всего: 44 |
Все понял! речь о том что бы в режиме РЕАЛЬНОГО ВРЕМНИ показывать на каком этапе выполняется процедура.
не стоит, буду пробывать на оракл, но что то мне подсказывает, что если даже удасться получить то что там сервер нагкнерил, то все равно все эти логи вернутья после завершения всей процедуры. |
|||
|
||||
Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
Не совсем. Он в любом случае возвращает только после завершения всей транзакции. У меня очень сложная процедура. И есть необходимость вести лог по всем добавлениям в базу. Тобишь один курсор проходя по таблице в зависимости от данных находящихся в конкретной записи запускает разные процедуры. Это он выводит через принт. Мне необходимо показать что и для какой записи он сделал. Это выклядит как (пример) Для тратата1 создано 3 записи в ппп (дата и время) для тратата2 перенесено ... в ... (дата и время) ... И.т.д. |
|||
|
||||
Vit |
|
|||
![]() 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 |
|||
|
||||
Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
||||
|
||||
Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
||||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 Пробуйте, если хотите. Тест у меня дома - не забуду - завтра притащу. |
|||
|
||||
Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
Прикольно. Пасип.
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |