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

Вниз

Как узнать номер строки с ошибкой в MS SQL Server?   Найти похожие ветки 

 
lmatveev   (2003-10-30 13:35) [0]

Собственно subj. Когда делаешь запрос в Query Analyzer (или в ряде других средств), то в случае ошибки он выдает не только текст об ошибке, но и указывает в какой строке она произошла. Я тоже хочу это реализовать.
Для подключения я использую TADOConnection + OLE DB Provider for MS SQL Server.
В MSDN я вычитал, что такую инфу можно узнать, используя ODBC (использовать ODBC я принципиально не хочу, хотя подозреваю, что Query Analyzer именно так и работает) или через OLEDB.
Для того, чтобы узнать у OLEDB номер строки с ошибкой, ему вроде надо передать евойный интерфейс, вызвавший эту ошибку... А как его получить через ADOConnection?
Там же на MSDN нашел непонятную фразу: ADO does not support any provider-specific error interfaces, so SQL Server-specific error information such as the severity or state are available to ADO applications...
Короче, если кто знает как получить номер строки с ошибкой - очень прошу помочь


 
lmatveev   (2003-10-30 21:50) [1]

Неужто совсем никаких идей?


 
Fay   (2003-10-30 22:07) [2]

Ты в Delphi ведь знаешь, в какой строке Exception вылазит?


 
Fay   (2003-10-30 22:08) [3]

Намёк - в QA есть отладчик


 
lmatveev   (2003-10-30 23:26) [4]

Сильно сомневаюсь, что в QA есть отладчик, но даже если он и есть - информацию он с сервера берет. Так вот и вопрос в том как получить эту инфу.
А сравнение с Delphi мне кажется не совсем удачное - ведь в Delphi мне программу надо из под Delphi и запустить, чтобы строку с ошибкой узнать, а QA ведь сервер не запускает... Или я чего-то не понимаю?


 
Mike_Goblin   (2003-10-31 10:46) [5]

Идеи есть, одна из них посмотреть в сторону TAdOConnection.Errors
Возможно, нужная Вам информация там есть
Неплохо почтитать и это http://delphi.about.com/library/weekly/aa103001a.htm


 
lmatveev   (2003-10-31 13:57) [6]

В ADOConnection.Errors такой информации нет. Это я посмотрел в первую очередь. Ссылку щас попробую почитать.
Еще идеи?


 
sniknik   (2003-10-31 14:15) [7]

lmatveev (31.10.03 13:57) [6]
> В ADOConnection.Errors такой информации нет.
как так нет, есть, когда передается
вот выполни к примеру в запросе
print "строка 1"
print "строка 2" ошибка
получиш "Line 2" первым в эксепте

> Еще идеи?
анализатор запроса писать такойже как в Query Analyzer используется
(если ты имееш ввиду первую строку красным которую он выдает при выполнении)


 
lmatveev   (2003-10-31 15:12) [8]

В этом случае передается просто текст ошибки, который в ДАННОМ случае содержит номер строки. А QA всегда узнает номер строки. И узнает он это не из текста ошибки.
Дело в том, что QA использует для подключения к серверу ODBC драйвер, а через ODBC эту инфу получить можно. Я даже знаю как.
Но мне нужно узнать это через ADO+OLE DB Provider for SQL Server...


 
sniknik   (2003-10-31 15:17) [9]

> А QA всегда узнает номер строки.
не скажи

SELECT *
FROM
NothingTable --Несуществующая таблица

выдал
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name "NothingTable".


 
lmatveev   (2003-10-31 15:31) [10]

Ну это уже проблема сервера - он видимо всю команду в батче воспринимает как одну строку. Видимо надо сказать > А QA ПОЧТИ всегда узнает номер строки, но не только когда ее номер содержится в тексте ошибки.


 
sniknik   (2003-10-31 15:45) [11]

тогда дай пример запроса который там распознается а ADO нет.


 
sniknik   (2003-10-31 15:48) [12]

заодно и метод как узнать через ODBC, у меня сообщения мало чем отличаются (в онформационной части)
на вышеприведенный запрос
ADO
Invalid object name "NothingTable"

ODBC
[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name "NothingTable"


 
Юрий Жуков   (2003-10-31 18:05) [13]

Немного не по теме, но в Работающем приложении Delphi можно легко узнать в какой строке произошла ошибка. И компонет таких с десяток можно найти. Например
JCL (JEDI)
Eureka Exception log


 
lmatveev   (2003-10-31 19:53) [14]


> sniknik © (31.10.03 15:45) [11]
> тогда дай пример запроса который там распознается а ADO нет.

create proc test
as
select 1 from sysobjects
select 2 from syscomments
set ectvvuyv
go

Вот сообщение в QA:
Server: Msg 170, Level 15, State 1, Procedure test, Line 5
Line 5: Incorrect syntax near "ectvvuyv".

А вот все что можно вытянуть из ADO:
Description: "ectvvuyv" is not a recognized SET statement.; Error Number: -2147217900; SQL State: 42000; Source: Microsoft OLE DB Provider for SQL Server; Native Error: 195


> sniknik © (31.10.03 15:48) [12]
> заодно и метод как узнать через ODBC, у меня сообщения мало
> чем отличаются (в онформационной части)

В ODBC есть специальные API функции, которые возвращают детализацию об ошибке. Типа SQLGetDiagRec, SQLGetDiagield и т.п. В частности SQLGetDiagield содержит поля
SQL_DIAG_SS_LINE - номер строки с ошибкой (именно это мне и надо)
SQL_DIAG_SS_SEVERITY - значение Severity (тоже полезная информация при использоании RAISERROR


 
lmatveev   (2003-10-31 19:54) [15]


> lmatveev (31.10.03 19:53) [14]


> Типа SQLGetDiagRec, SQLGetDiagield и т.п. В частности SQLGetDiagield ...
>

Здесь вместо SQLGetDiagield надо читать SQLGetDiagField


 
lmatveev   (2003-10-31 20:04) [16]


> Юрий Жуков (31.10.03 18:05) [13]

Никогда такими компонентами не пользовался, но думаю, чтобы узнать номер строки с ошибкой, они должны быть скомпилены вместе с приложением. Т.к. в работающем приложении, на чем бы оно не было написано НЕТ ИНФОРМАЦИИ о номерах строк исходников.
Возможно, добавив этот компонент на этапе компиляции они будут собирать информацию об исходниках или что-то в этом роде (типа Assert). В любом случае, наверное, можно будет в RunTime спросить у приложения в какой строке ошибка. Но при этом, в зависимости от настроения автора приложения, оно будет либо для всех ошибок выдавать эту информацию всегда, либо у приложения можно будет "спросить" детальную информацию об ошибке.
Раз уж MS SQL Server не выдает эту информацию в каждом сообщении, меня интересует как его об этом спросить. Ну то есть это немного сложнее, но общий смысл такой


 
lmatveev   (2003-10-31 20:34) [17]

Кстати, нашел в библиотеке sdiclnt.dll интерфейсы ISqlDebugger, ISqlDebugHost, ISqlDebugEvent, ISqlDebugEventCallback...
Похоже, что это интерфейсы, испорльзуемые QA при вызове команды Debug для хранимой процедуры. Может кто знает как их использовать?


 
lmatveev   (2003-11-01 03:19) [18]

Больше никто ничем не поможет?


 
Suntechnic   (2003-11-01 05:46) [19]

Вот здесь почитай подробнее:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/acdata/ac_8_con_05_4pv7.asp

Краткое резюме такое. ADO не даёт доступа к этой иформации, а вот в OLE DB через ISQLServerErrorInfo эту информацию достать можно.

Учитывая тот факт, что ADO это всего лишь надстройка над OLE DB, то, наверное, достать это всё-таки можно.


 
lmatveev   (2003-11-01 16:27) [20]


> Suntechnic © (01.11.03 05:46) [19]

Это я уже читал. Имеенно оттуда у меня цитата в первом сообщении. Вот вопрос то у меня как раз в том как через ADO достучаться до ISQLServerErrorInfo?


 
sniknik   (2003-11-01 19:45) [21]

lmatveev (31.10.03 19:53) [14]
попробовал пример, ADO выдает
Line 5: Incorrect syntax near "ectvvuyv"

т.е. пока мне кажется, инфа анологичная.


 
sniknik   (2003-11-01 19:47) [22]

> А вот все что можно вытянуть из ADO:
Description: "ectvvuyv" is not a recognized SET statement.; Error Number: -2147217900; SQL State: 42000; Source: Microsoft OLE DB Provider for SQL Server; Native Error: 195

как читаеш? я просто строку из ексепта (EOleException).


 
sniknik   (2003-11-01 19:51) [23]

да еще, то что в ODBC есть ODBC API функции я в курсе, интересно былобы с примером. (на предмет а действительно ли они возвращают? то что нужно)
подозрение есть что это не так, у него же не собственный "разборщик" синтаксиса, знает только то что ему в свою очередь SQL сервер дает.


 
lmatveev   (2003-11-01 21:17) [24]


> sniknik © (01.11.03 19:47) [22]

Я привел все поля, котрые есть в ADOConnection.Errors
При этом в EOLEException.Message у меня было только "ectvvuyv" is not a recognized SET statement."
Можно узнать как ты получил "Line 5: Incorrect syntax near "ectvvuyv""? Мне в принципе именно это и нужно.

> sniknik © (01.11.03 19:51) [23]

С ODBC я не разбирался, т.к. мне это принципиально не подходит, а ради спортивного интереса некогда...


 
lmatveev   (2003-11-01 21:32) [25]

Только что еще раз попробовал свой же пример и получил "Line 5: Incorrect syntax near "ectvvuyv"" !? Т.е. совсем не то, что в прошлый раз...


 
sniknik   (2003-11-02 00:38) [26]

вот я про тоже, вроде бы и разници никакой нет. (во всяком случае мне не удалось получить)
случайно не на разных машинах пробовал? в смысле может ADO старой версии действительно не так выдает(?)


 
lmatveev   (2003-11-02 21:15) [27]

Пробовал на разных машинах - результат везеде одинаковый. Я просто неудачный пример привел. Если в этот пример ниже добавить любые несколько строк, то и будет та ситуация, которую я пытаюсь разрулить. Вот 100% пример:
create proc test
as
select 1 from sysobjects
select 2 from syscomments
set ectvvuyv
12345

Т.е. после строки с ошибкой стоит еще хотя бы одна любая строка. Тогда мы имеем
В QA:
Server: Msg 195, Level 15, State 7, Procedure test, Line 6
"ectvvuyv" is not a recognized SET statement.

В ADO:
Description: "ectvvuyv" is not a recognized SET statement.
Error Number: -2147217900
SQL State: 42000
Source: Microsoft OLE DB Provider for SQL Server
Native Error: 195

Здесь ясно видно, что и там, и там номера строки в сообщении нет. Но QA пишет еще доп. информацию об ошибке, где содержится номер строки, severiry level и т.д.
Вот именно способ получения информации, которую QA пишет в первой строке меня так сильно и интересует...



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

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

Наверх




Память: 0.51 MB
Время: 0.011 c
1-65956
Igorek
2003-11-08 10:45
2003.11.20
Проблема с Event в DesignTime


4-66154
LOX
2003-09-11 15:04
2003.11.20
Как отловить нажатие клавиш


1-65860
ovling
2003-11-11 12:19
2003.11.20
Проблема при чтении из файла


14-66080
Rauf
2003-10-30 02:00
2003.11.20
Подскожите, проблема c синтаксисjv VBA


1-65931
Zheks
2003-11-11 11:15
2003.11.20
Диалог выбора дирректории





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский