Получение всех принтов из запроса

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Ответить
Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Получение всех принтов из запроса

Сообщение Zelius » Чт 05 дек 2013 11:01

Добрый день! Подскажите, как обстоят в SDAC дела с получением вывода оператором print? В ADO много ограничений, например необходимо, что бы курсор был серверным, set nocount on везде ставить. Спасибо!
С уважением, Константин

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Получение всех принтов из запроса

Сообщение AndreyZ » Чт 05 дек 2013 13:15

Здравствуйте,

Для получения вывода оператора PRINT, Вам следует использовать событие TMSConnection.OnInfoMessage. Пример кода:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
  MSQuery1.SQL.Text := 'PRINT ''testing''';
  MSQuery1.Execute;
end;

procedure TForm1.MSConnection1InfoMessage(Sender: TObject; E: EMSError);
begin
  ShowMessage(E.Message);
end;
Заметьте что для выполнения данного кода, Вам следует добавить модуль OLEDBAccess в секцию USES Вашего модуля.
Данный код выполняется с использованием клиентского курсора (TMSQuery использует его по умолчанию) и на него не влияет оператор "SET NOCOUNT".

qwertehok
Сообщения: 8
Зарегистрирован: Ср 22 янв 2014 09:18

Re: Получение всех принтов из запроса

Сообщение qwertehok » Ср 22 янв 2014 09:20

А подскажите как этот же результат получить для MS SQL?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Получение всех принтов из запроса

Сообщение Alexp » Ср 22 янв 2014 11:09

Пример приведенный в предыдущем посте демонстрирует работу как раз с MS SQL Server

qwertehok
Сообщения: 8
Зарегистрирован: Ср 22 янв 2014 09:18

Re: Получение всех принтов из запроса

Сообщение qwertehok » Ср 22 янв 2014 11:14

Тогда, если можно, поясните откуда взять
MSConnection1InfoMessage
и
зачем нужен курсор?

Может я что-то не понимаю?
Мне нужно выполнить скрипт на 6000 строк. Для отладки я добавляю в код

Код: Выделить всё

print 'Ошибка Номер ХХХ'
в дельфи это вот так

Код: Выделить всё

UniQuery1.SQL.Text:='print ''Ошибка Номер ХХХ''';
Как вывести эту строку на форму?

ЗЫ скрипт запихиваю в UniScript

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Получение всех принтов из запроса

Сообщение Alexp » Ср 22 янв 2014 11:45

Cобытие onInfoMessage реализовано в компоненте TMSConnection.
Пример получения сообщения приведен в предыдущем посте

qwertehok
Сообщения: 8
Зарегистрирован: Ср 22 янв 2014 09:18

Re: Получение всех принтов из запроса

Сообщение qwertehok » Ср 22 янв 2014 11:49

Alexp писал(а):Cобытие onInfoMessage реализовано в компоненте TMSConnection.
Пример получения сообщения приведен в предыдущем посте
У меня Delphi XE и UniDac.
У меня нет TMSConnection.

Можно реализовать вывод без этого компонента?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Получение всех принтов из запроса

Сообщение Alexp » Ср 22 янв 2014 12:09

Команда PRINT есть только в MS SQL Server поэтому возможность работы с ней реализована только в SDAC, в UniDAC Вы не сможете получать эти ссобщения

qwertehok
Сообщения: 8
Зарегистрирован: Ср 22 янв 2014 09:18

Re: Получение всех принтов из запроса

Сообщение qwertehok » Ср 22 янв 2014 15:09

спасибо, все работает

но теперь появился другой вопрос

команда

Код: Выделить всё

print '123'
go
print '321'
выдает но если делать в рабочем коде

Код: Выделить всё

print CONVERT(nvarchar,GETDATE(),103) + ' : Начинаю обновление патчем от разработчика.'

GO
ALTER PROCEDURE [dbo].[i_imp_FrontolAtol_DataType_Article] (@DriverID AS INT, @SectionID AS INT, @LIVersion AS BIGINT)
AS
BEGIN
SET NOCOUNT ON
...
print ''
Начинает ругаться встроенный редактор кода так как теряется контекст БД.
Начали добавлять

Код: Выделить всё

MSScript1.SQL.Insert(0,'Use sms_tech');
Ругаться перестало, но теперь код

Код: Выделить всё

print '123'
go
print '321'
выдает только Подскажите пожалуйста (если поняли) :)

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Получение всех принтов из запроса

Сообщение Alexp » Ср 22 янв 2014 15:36

Пожалуйста приведите либо полный текст скрипта, либо создайте небольшой скрипт, который воспроизводит проблему и пришлите его нам что бы мы могли повторить описанную вами ситуацию

qwertehok
Сообщения: 8
Зарегистрирован: Ср 22 янв 2014 09:18

Re: Получение всех принтов из запроса

Сообщение qwertehok » Чт 23 янв 2014 06:22

вот этот файл нужно выполнить и вывести на форму команду print которая идет в конце
в Студии выводится

как делаю я

Код: Выделить всё

MSScript1.SQL:=RzMemo1.Lines;
  MSConnection1.Connected:=True;
  MSScript1.Execute;

  MSConnection1.Connected:=False;
В свойствах MSScript стоит DataSet=MSQuery1. И к этому MSQuery1 ваш обработчик с E.Message

PS файл это не ZIP
Вложения
2.sql.zip
(7.8 КБ) 156 скачиваний

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Получение всех принтов из запроса

Сообщение Alexp » Чт 23 янв 2014 09:20

Пришлите также скриты для создания объетов БД

P.S. В данный момент при выполнении вашего скритпа Вылаеться ошибка о том что процедура несуществует, а затем выводиться сообщение 'done'

qwertehok
Сообщения: 8
Зарегистрирован: Ср 22 янв 2014 09:18

Re: Получение всех принтов из запроса

Сообщение qwertehok » Чт 23 янв 2014 11:11

спасибо огромное за помощь

ошибку нашли - это оказались огромные комментарии вот такого вида --********
разработчики вписали туда очень много звездочек и, видимо, скрипт обрезал строку и на новой оказывали незакоментированные ****.

еще раз спасибо.

ЗЫ а если можно добавить возможность отлавливать print в unidac - было бы вообще замечательно.
удалите пожалуйста мои сообщения.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Получение всех принтов из запроса

Сообщение Alexp » Чт 23 янв 2014 15:10

Эта возможность поддерживаеться только в SQL Server, а так как UniDAC предназначен для работы со многими БД мы не можем реализовать это поведение так как в других серверах оно не поддерживаеться.

Ответить