![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO Errors проблема [D6, MSSQL]
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, а я получаю только первое