Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO Errors проблема [D6, MSSQL]


Страницы:   1 2 3

Fiend ©   (2005-01-25 10:48:00) 

Здравствуйте уважаемые!!!

Выполняю большой запрос из своего софта. Запрос во время работы выводит некоторую информацию. В запросе используется курсор.

Так вот пытаюсь поймать в приложении, что пишет сервер, а получается отловить только первое сообщение. В скрипте для выдачи сообщений пробовал и PRINT 'asdasd'  и RaisError ('asdasd', 10, 1) эффект одинаковый.

Помогите пожалуйста!


Danilka   (2005-01-25 15:43:00) [21]

[20] sniknik ©   (25.01.05 15:30)
И что, print пропускает? Здесь не пробовал, нет МССкуля, а дома не пущщала, терялся где-то в недрах обертки. :)


sniknik   (2005-01-25 15:30:00) [22]

> В каком смысле где? Ставлю у ADOConnection перед коннектом.
вот именно в этом смысле, а у ADODataSet-а почему не ставиш?

Nikolay M. ©   (25.01.05 15:27) [19]
> Там хают как раз дельфевую обертку над собственно ActiveX-ными АДО-шными объектами
в VB
для дельфей она нормальная, у меня же как то работает. ;о))


Nikolay M.   (2005-01-25 15:27:00) [23]


> Ну на сколько я понял они предложили выполнять запросы не
> через ADOCOnnection а через ADOCommand

Неправильно понял. Там хают как раз дельфевую обертку над собственно ActiveX-ными АДО-шными объектами и в примере показано, как можно создавать их самому.


Danilka   (2005-01-25 15:23:00) [24]

[16] Fiend ©   (25.01.05 15:19)
Нет. Там не используют дельфи-компоненты, которые являются оберткой АктивеХ АДО компонентов, а напрямую создают их, CreateOLEObject, в этом самое главное отличие.


Fiend   (2005-01-25 15:22:00) [25]

Есть конечно деревянный метод, создать временную таблицу и писать туда месседжи. м в другом потоке читать их постепенно. Но это совсем некрасиво. Пока есть вермя, хочется разобраться в чем дело


Fiend   (2005-01-25 15:19:00) [26]


> Nikolay M. ©   (25.01.05 15:14) [15]

Ну на сколько я понял они предложили выполнять запросы не через ADOCOnnection а через ADOCommand. Я так же сделал, не работает, ну в смысле эффект тот же. Блин, танец с бубном какой-то. rrr


Nikolay M.   (2005-01-25 15:14:00) [27]


> Fiend ©   (25.01.05 15:00) [14]

Нет, мысль не прошла :(
А через АДО-шные объекты как в той ссылке, которую я указал, работает?


Fiend   (2005-01-25 15:00:00) [28]


> sniknik ©   (25.01.05 13:24) [12]

В каком смысле где? Ставлю у ADOConnection перед коннектом.


> Nikolay M. ©   (25.01.05 14:04) [13]


Пробую в основном. Тот же эффект. Сервер поуказывает только один процесс.

Какая мысль?


Nikolay M.   (2005-01-25 14:04:00) [29]


> Fiend ©   (25.01.05 13:04) [11]

А ты все-таки попробуй не в отдельном. И еще посмотри на сервере, сколько от тебя запущено процессов. Есть одна мысль...


sniknik   (2005-01-25 13:24:00) [30]

> попробовал CursorLocation:= clUseServer не помогло.
а где ставиш это?


Fiend   (2005-01-25 13:04:00) [31]

То Nikolay M. ©   (25.01.05 12:29) [9]

> Попробуй выполнять синхронно.

Дык синхронно и выполняю, тока в отдельном потоке, чтобы пользователя не испугать внезапно замершим окном.

попробовал CursorLocation:= clUseServer не помогло.


Nikolay M.   (2005-01-25 12:32:00) [32]


> Danilka ©   (25.01.05 12:29) [8]
> Там по ссылке, что я привел, есть еще одна ссылка на sql.ru.
> Там уже ругаются на дельфовую реализацию АДО, и приведен
> пример, как получить print-ы.

Есть. Описан. Руками создавать АДОшные объекты не совсем удобно. Хотя, если автору это действительно нужно...


Nikolay M.   (2005-01-25 12:29:00) [33]

Сей баг описан.
http://search.microsoft.com/search/results.aspx?view=msdn&st=b&na=82&qu=231985&s=1
Попробуй выполнять синхронно.


Danilka   (2005-01-25 12:29:00) [34]

[7] Fiend ©   (25.01.05 12:09)
Там по ссылке, что я привел, есть еще одна ссылка на sql.ru.
Там уже ругаются на дельфовую реализацию АДО, и приведен пример, как получить print-ы.


Fiend   (2005-01-25 12:09:00) [35]


> RaisError? а не RaiseError? говориш оно у тебя работает
> но не посылает?

Не надо смеяться. Именно RaisError. Дело в том что QA эти сообщения видит и показывает, хоть print хоть RaisError.
Если поставить уровень 16 то скрипт остановится и ADO просто гавкнет про ошибку и дальше скрипт не будет выполняться.

А оно и не должно говорить ошибку. мне нужно просто информационное сообщение. обработано то-то, выполнено то-то


sniknik   (2005-01-25 12:02:00) [36]

RaisError? а не Rais eError? говориш оно у тебя работает но не посылает? ;о)) могу послать за него. ;о))

p.s. собака рылась в уровне ошибки... (не зря же в BOL ее 16м ставят, у тебя же ничем от принта не отличается)


Fiend   (2005-01-25 11:32:00) [37]

Где собака порылась?


Fiend   (2005-01-25 11:15:00) [38]

Простите.
запрос такой:
--delete from KrUGG..Abonent
SET NOCOUNT ON

DECLARE @ABON int, @FIO varchar(20), @S numeric(6, 2), @KOL int, @KUL int, @NDOM varchar(8)
declare @RowCounter int,
@CharCounter int,
@HouseNumber varchar(10),
@HouseLetter varchar(10),
@Flat varchar(10),
@Message varchar(200),
@HouseNumberCompleted smallint,
@IsHouseLetter smallint,
@IsFlat smallint

set @RowCounter = 0
DECLARE ABONCur CURSOR FOR
SELECT ABON, FIO, S, KOL, KUL, NDOM
FROM BABON

OPEN ABONCur

FETCH NEXT FROM ABONCur
INTO @ABON, @FIO, @S, @KOL, @KUL, @NDOM

WHILE @@FETCH_STATUS = 0
BEGIN

set @CharCounter = 1
set @HouseNumber = null
set @HouseLetter = null
set @Flat = null
set @HouseNumberCompleted = 0
set @IsHouseLetter = 0
set @IsFlat = 0

if IsNumeric(@NDOM) = 1
set @RowCounter = @RowCounter + 1
else begin
 while @CharCounter <= DataLength(@NDOM)
 begin
 if (SubString(@NDOM, @CharCounter, 1) in ('.', '/', '\', '-', ' ')and
    @HouseNumber is not null)or
  ((Upper(SubString(@NDOM, @CharCounter , 1)) between 'А' and 'Я' or
    Upper(SubString(@NDOM, @CharCounter , 1)) between 'A' and 'Z')and
    @HouseNumber is not null)
   set @HouseNumberCompleted = 1

 if @HouseNumberCompleted = 1 and
  @IsFlat = 0 and
  (Upper(SubString(@NDOM, @CharCounter, 1)) between 'А' and 'Я' or
   Upper(SubString(@NDOM, @CharCounter, 1)) between 'A' and 'Z')
  set @IsHouseLetter = 1

 if SubString(@NDOM, @CharCounter, 1) in ('.', '/', '\', '-', ' ') and
  @HouseNumberCompleted = 1 and
  @IsFlat = 0 and
  (Upper(SubString(@NDOM, @CharCounter + 1, 1)) between 'А' and 'Я' or
   Upper(SubString(@NDOM, @CharCounter + 1, 1)) between 'A' and 'Z')
  set @IsHouseLetter = 1

 if @HouseNumberCompleted = 1 and
  @IsFlat = 0 and
  SubString(@NDOM, @CharCounter , 1) between '0' and '9'
  set @IsFlat = 1

 if SubString(@NDOM, @CharCounter, 1) in ('.', '/', '\', '-', ' ') and
  @HouseNumberCompleted = 1 and
  @IsFlat = 0 and
  SubString(@NDOM, @CharCounter + 1, 1) between '0' and '9'
  set @IsFlat = 1

 if (SubString(@NDOM, @CharCounter, 1) between '0' and '9') and
  @HouseNumberCompleted = 0
  set @HouseNumber = coalesce(@HouseNumber, '') + SubString(@NDOM, @CharCounter, 1)

 if (Upper(SubString(@NDOM, @CharCounter, 1)) between 'А' and 'Я' or
     Upper(SubString(@NDOM, @CharCounter, 1)) between 'A' and 'Z') and
  @IsHouseLetter = 1 and
  @IsFlat = 0
  set @HouseLetter = coalesce(@HouseLetter, '') + SubString(@NDOM, @CharCounter, 1)

 if (SubString(@NDOM, @CharCounter, 1) between '0' and '9') and
  @IsFlat = 1
  set @Flat = coalesce(@Flat, '') + SubString(@NDOM, @CharCounter, 1)

 set @CharCounter  = @CharCounter + 1
 end
if @HouseNumber is null and
   @HouseLetter is null and
   @Flat is null
   set @HouseLetter = '['+@NDOM+']'
set @RowCounter = @RowCounter + 1
set @Message = convert(varchar(20), coalesce(@ABON, '[null]')) + '-' +  coalesce(@NDOM, '[null]') + ' = ' + coalesce(@HouseNumber, '') + ' ' + coalesce(@HouseLetter, '') + ' ' + coalesce(@Flat, '')
RaisError(@Message, 10, 1) with nowait
-- print @Message
end

FETCH NEXT FROM ABONCur
INTO @ABON, @FIO, @S, @KOL, @KUL, @NDOM
END

CLOSE ABONCur
DEALLOCATE ABONCur

print @RowCounter
SET NOCOUNT OFF

ловлю ошибки так:
procedure TQueryThread.OnInfoMessage(
 Connection: TADOConnection; const Error: Error;
 var EventStatus: TEventStatus);
var MCounter: Integer;
begin
for MCounter:=0 to Connection.Errors.Count - 1
   do LogMessage(Connection.Errors[MCounter].Description)
end;
это обработчик события TADOCOnnection.OnInfoMessage
запрос выполняется в отдельном потоке


Nikolay M.   (2005-01-25 11:06:00) [39]

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


Fiend   (2005-01-25 11:02:00) [40]

там нет ошибок. там есть информационные сообщения. Я их хочу показывать клиенту во время работы скрипта. Сообщения приходит скажем штук 100, а я получаю только первое


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо