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-26 13:18:00) [1]

[40] sniknik ©   (26.01.05 11:24)
Понятно. Ну, в принципе, вполне логично, так сделать. Если драйвер А обладает всей функциональностью драйвера Б и еще дополнительной сверху, то проще развивать/исправлять ошибки А, а Б переписать на его использование. :) А то, что они об этом молчат (по-крайней мере я нигде не встречал), а зачем это кому-то надо? :))


sniknik   (2005-01-26 11:24:00) [2]

> У меня есть только 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 идентичных драйвера? пусть если старый там и остается, а если новый то в одном месте, только для совместимости со старыми программами в одном оставляем пустые процедуры просто с вызовом аналогичной функции из другого.

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


Fiend   (2005-01-26 11:08:00) [3]

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

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


Danilka   (2005-01-26 10:22:00) [4]

[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, а в обратную сторону я не слышал.


sniknik   (2005-01-26 08:47:00) [5]

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

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

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


sniknik   (2005-01-26 08:34:00) [6]

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

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

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


Danilka   (2005-01-26 08:31:00) [7]

А что вообще можно почитать в тему 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.

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


Danilka   (2005-01-26 08:11:00) [8]

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


Danilka   (2005-01-25 21:29:00) [9]

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


sniknik   (2005-01-25 21:27:00) [10]

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


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

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

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 16:27:00) [12]

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

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


Fiend   (2005-01-25 16:14:00) [13]

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


sniknik   (2005-01-25 16:10:00) [14]

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


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

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


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

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

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

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

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


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

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

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


Danilka   (2005-01-25 15:54:00) [18]

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

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


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

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


sniknik   (2005-01-25 15:47:00) [20]

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

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


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

Наверх

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