Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

ADO Errors проблема   Найти похожие ветки 

 
Fiend ©   (2005-01-25 10:48) [0]

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

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

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

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


 
Danilka ©   (2005-01-25 10:55) [1]

1. Как "отловить сообщение":
http://delphimaster.net/view/3-1106044778/

2. Что мешает выполнить проблемный запрос в Квери Аналайзере и посмотреть какие ошибки есть?


 
Fiend ©   (2005-01-25 11:02) [2]

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


 
Nikolay M. ©   (2005-01-25 11:06) [3]

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


 
Fiend ©   (2005-01-25 11:15) [4]

Простите.
запрос такой:
--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
запрос выполняется в отдельном потоке


 
Fiend ©   (2005-01-25 11:32) [5]

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


 
sniknik ©   (2005-01-25 12:02) [6]

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

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


 
Fiend ©   (2005-01-25 12:09) [7]


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

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

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


 
Danilka ©   (2005-01-25 12:29) [8]

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


 
Nikolay M. ©   (2005-01-25 12:29) [9]

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


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


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

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


 
Fiend ©   (2005-01-25 13:04) [11]

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

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

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

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


 
sniknik ©   (2005-01-25 13:24) [12]

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


 
Nikolay M. ©   (2005-01-25 14:04) [13]


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

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


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


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

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


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


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

Какая мысль?


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


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

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


 
Fiend ©   (2005-01-25 15:19) [16]


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

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


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

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


 
Danilka ©   (2005-01-25 15:23) [18]

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


 
Nikolay M. ©   (2005-01-25 15:27) [19]


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

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


 
sniknik ©   (2005-01-25 15:30) [20]

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

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


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

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


 
sniknik ©   (2005-01-25 15:47) [22]

> И что, print пропускает?
а то! ;о) 2 способа 4 реализации одного и тогоже, и все работают.

ты ветку то читал которую сам давал? или думаеш это я так просто для красного словца ляпнул?


 
Fiend ©   (2005-01-25 15:51) [23]

простите за невнимательность. вчитался, сделал сквозь CreateOLEObject. ТОТ ЖЕ ФИГ. блин. тока первое вернуло и привет


 
Danilka ©   (2005-01-25 15:54) [24]

[22] sniknik ©   (25.01.05 15:47)
> ты ветку то читал которую сам давал?

Чукча не читатель, чукча писатель :)
От тебя там одни намёки, но ради интереса дома посмотрю повнимательнее что к чему. :)


 
sniknik ©   (2005-01-25 16:04) [25]

> От тебя там одни намёки,
стараюсь! черт возми. ;о)) (пытаюсь писать также как вопросы задают, если он мне кажется недостаточно описанным/ясным/требующим готового решения/неадекватно реагируют на дополнения/.../да просто не нравится то.... ;о))

не, ну с чего на недомолвки отвечать ясно и четко? на пару фраз вопроса две страници ответа писать?
так только работы добавится а веселье кончится.


 
Fiend ©   (2005-01-25 16:05) [26]

УУУУУУУУУУУУУРРРРРРРРРРРРРРАААААААААААААААА!!!!!!!!!!
ЗАРАБОТАЛАААААААААА (кто матроскин)!
Всем спасибо

а западло было вот в чем

в одной статье я прочел такую информацию, от коллеги по беде, что вот он мол пробовал при провайдере SQLOLEDB и у него ничего не получалось, а при MSDASQL фсе заработало. я вроде смотрю у ADOConnection стоит провайдер MSDASQL, и чисто случаянно обратил внимание на свой ConnectionString а в нем жестко прописано Provider=SQLOLEDB.1, я его заменил на нужное и счастье настало незамедлительно.

СПАСИБО ВСЕМ ЗА ТРУД!!!


 
Fiend ©   (2005-01-25 16:05) [27]

Удалено модератором
Примечание: дубль


 
sniknik ©   (2005-01-25 16:10) [28]

> MSDASQL
круто! ;о)) через ODBC OLEDB-шные фенечки пытаться получить.
а вот кто бы догадался? ;)


 
Fiend ©   (2005-01-25 16:14) [29]

Ну а что я могу сделать, тока так заработало. причем по сути ведь, майкрософт написала, что в адо неверно реализован механизм. а в ОДБЦ все нормально. Оно конечно жерез (Ж), но эффекта добился. мне большего и не надо.


 
sniknik ©   (2005-01-25 16:27) [30]

у меня работает с коннектом
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False

> майкрософт написала, что в адо неверно реализован механизм. а в ОДБЦ все нормально.
ну а типа к ODBC ты не через ADO конектишся? не, ты там нек все понял. не в ADO в обертке.


 
Danilka ©   (2005-01-25 21:21) [31]

Вобщем, так, немного посидел, поэкспериментировал:

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 str: String;
begin
 str :=
   "print ""proba pera1"""#10#13+
   "print ""proba pera2"""#10#13+
   "print ""proba pera3""";
 ADOConnection1.Execute(str);
 for i:=0 to ADOConnection1.Errors.Count-1 do
   ShowMessage(ADOConnection1.Errors.Item[i].Description);
end;


Увы и ах, возвращает только первый принт.
Но вот-так:

procedure TForm1.Button2Click(Sender: TObject);
var
 i: Integer;
 ra: OleVariant;
 rs: _Recordset;
 str: String;
begin
 str :=
   "print ""proba pera1"""#10#13+
   "print ""proba pera2"""#10#13+
   "print ""proba pera3""";
 rs := ADOConnection1.Execute(str);
 repeat
   for i:=0 to ADOConnection1.Errors.Count-1 do
     ShowMessage(ADOConnection1.Errors.Item[i].Description);
   if rs <> nil then
     rs := rs.NextRecordset(ra);
 until (rs = nil);
end;


Все принты на месте. :)


 
sniknik ©   (2005-01-25 21:27) [32]

Danilka ©   (25.01.05 21:21) [31]
good! см. почту, найди 10-ть отличий. ;о))


 
Danilka ©   (2005-01-25 21:29) [33]

[32] sniknik ©   (25.01.05 21:27)
Почта будет только утром. :(
Ничего, завтра посмотрю, спать уже пора. :)


 
Danilka ©   (2005-01-26 08:11) [34]

[32] sniknik ©   (25.01.05 21:27)
Посмотрел, действительно 4 варианта. :)
Правда, 3 от 4 отличается только типом курсора, а как он действовать будет нет возможности проверить - на работе нет МССкуля. :(
То-есть, идея такая, если курсор серверный, то OnInfoMessage дергается для print-ов, а если клиентский, то нет?


 
Danilka ©   (2005-01-26 08:31) [35]

А что вообще можно почитать в тему ADO и MSSQL?
Есть у меня Programming ADO в виде chm, от Microsoft Press, написана неким David Sceppa, но там как-раз про InfoMessage есть такие строчки:

When you connect to SQL Server through the SQL Server ODBC driver, you"ll receive messages that state which database you"re using (if you"re not using the default Master database) and the programming language you"re using. I"m not sure why, but these messages are not returned when connecting through the SQL Server OLE DB provider.

Вобщем, нет больше никакого доверия к этой книжке. :)


 
sniknik ©   (2005-01-26 08:34) [36]

варианта 2 по типу откуда получаем ошибки/сообщения, 4 реализации. (не заметил 1 - 4 то же самое просто с динамическим созданием компонент без дельфевой обертки, 2-й получение дополнительно рекордсета результирующего, 3 там тоже с чемто сходится)
(можно еще добавить ODBC-шный вариант, но это тоже будет чтото аналогичное но в недрах ODBC, вот перестрой конект и посмотри как изменятся сообщения, там то же самое будет но с допиской типа уже не от сервера а от ODBC получаем)

> То-есть, идея такая, если курсор серверный, то OnInfoMessage дергается для print-ов, а если клиентский, то нет?
в общем то да так и есть (во всяком случае получить с локальным мне не удавалось)
а те гневные отклики (не на майкрософте, где глюк в ихней же обертке) а форумах, типа борланд нифига не может делайте сами (читал?) там почемуто не рассматриваются различия в настройках(видать не догадываются что есть такое ;) и работает у них только то что по умолчанию нужные для них параметры задает...
вот поставь в 4-м варианте (кнопке) Conn.CursorLocation:= adUseClient; и проверь, тоже перестанет, несмотря на отсутствие обертки. ;о))

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


 
sniknik ©   (2005-01-26 08:47) [37]

> А что вообще можно почитать в тему ADO и MSSQL?
ado смотри у себя на машине ADO210.CHM (это от msoffice справка)
mssql банальный BOL. ;о)) тоже должен быть.

> Вобщем, нет больше никакого доверия к этой книжке. :)
можеш доверять. ;о)) заявление не ультимативное, человек не уверен о чем и пишет. я тоже так пишу когда не проверил но в принципе смутно догадываюсь так должно быть... (есстественно догадки процентов на 50 невернны ;о))

кстати вот одна из догадок. думаю с некоторых пор ODBC драйвера (MSSQL, ms dBase, ms Paradox, ...) работают через соответствующего OLE DB провайдера. уж очень много совпадений, ошибки например аналогичные, "фенечки" одних стали в других срабатывать... поэтому если кто говорит что ODBC умеет то что не умеет OLEDB ... ну не состоятельны. (если только доп. возможность реализована. вот это да, может быть, но не по работе с сервером)


 
Danilka ©   (2005-01-26 10:22) [38]

[36] sniknik ©   (26.01.05 08:34)
Понятно.

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

Угу, я сам тоже купился на это. :))

> ado смотри у себя на машине ADO210.CHM (это от msoffice
> справка)

У меня есть только ADO210.AW, а chm-ки нету. :(
А про документашку которая ставится вместе с МССкулем я как-то и позабыл. :) Вытащил только ярлык на рабочий стол для tsqlref, а остальное не глядел. :) Надо будет посмотреть, что там есть интересного.

> кстати вот одна из догадок. думаю с некоторых пор ODBC драйвера
> (MSSQL, ms dBase, ms Paradox, ...) работают через соответствующего
> OLE DB провайдера.

Ну, незнаю, вроде наоборот есть OLE DB Provider for ODBC, а в обратную сторону я не слышал.


 
Fiend ©   (2005-01-26 11:08) [39]

Мегасенкс ТО Danilka.

Оличный пример!


 
sniknik ©   (2005-01-26 11:24) [40]

> У меня есть только ADO210.AW, а chm-ки нету. :(
иши нерезанный msoffice 2000/xp переставляй полностью с документацией

> Ну, незнаю, вроде наоборот есть OLE DB Provider for ODBC, а в обратную сторону я не слышал.
не. провайдер ни причем, на уровне драйвера. т.е. уже после подключения. а так то, да, такой провайдер есть. ;о)
ну вот смотри, на пальцах.
естьтакой провайдер jet, у него есть "фенечки" исамы, возможность прямо в запросе обратится к внешней базе (из access к dbase и наоборот, если подключение к jet естственно)
т.е. делаеш подключение
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=dBase IV;Persist Security Info=False;Jet OLEDB:Encrypt Database=True
из этого подключения срабатывает запрос на выборку из базы access
SELECT * FROM Table1 IN "D:\Tr.MDB"
нормально, это его "фенечка".

но теперь меняем подключение, через ODBC
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=dBASE Files;DBQ=D:\;DefaultDir=D:\;DriverId=533;FIL=dBase 5.0;MaxBufferSize=2048;PageTimeout=5;"
и пытаемся сделать тот же запрос
SELECT * FROM Table1 IN "D:\Tr.MDB"
и он срабатывает! хотя у ODBC-шного драйвера такой "фенечки" нет, у него даже синтаксиса с IN нет. (по старым хелпам, в новые может и внесли)
т.е. отрабатывает на самом деле Jet, попробуй найти машину без него, и оно не будет работать в обоих случаях (в первом и не подключится)
понимаеш? получается вывод - мелкософт вместо написания полноценного драйвера ODBC с Jet-ом вставляет вместо него "пустышку", там просто редиректы на Jet (типа того). и в общем то и по человечески понятно... зачем "тянуть" 2 идентичных драйвера? пусть если старый там и остается, а если новый то в одном месте, только для совместимости со старыми программами в одном оставляем пустые процедуры просто с вызовом аналогичной функции из другого.

ну надеюсь понятно. (не просто смутные догадки в печатную форму переводить ;о))) естественно все может быть и не так, я же не программист майкософта который эти драйверы пишет...



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.055 c
1-1108287373
Porecla
2005-02-13 12:36
2005.02.27
Открыть папку ! помогите.


3-1106826055
juice
2005-01-27 14:40
2005.02.27
роли в IB Expert


3-1106818127
Valeriya
2005-01-27 12:28
2005.02.27
Как подключить данные из процедуры в XL Report?


1-1108545499
Начинающий 2
2005-02-16 12:18
2005.02.27
Импорт формы в форму из DLL.


9-1101385039
Xenon
2004-11-25 15:17
2005.02.27
Насчет выстрелов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский