Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Как узнать номер строки с ошибкой в 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.036 c
1-65936
Dr. Well
2003-11-11 13:08
2003.11.20
Шаг перемещения мыши


1-65844
slivka
2003-11-09 22:50
2003.11.20
Проблемма с Function. Подскажите что я сделал не так .


1-65832
FC
2003-11-08 22:26
2003.11.20
Запрет запуска программы


3-65747
Tumcoat
2003-11-03 04:58
2003.11.20
Переход из group или order by в обычный режим не теряя курсора.


1-65816
Анна
2003-11-10 15:38
2003.11.20
Диалог выбора директории