![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать номер строки с ошибкой в MS SQL Server? [D6, MSSQL]
lmatveev © (2003-10-30 13:35:00)
Собственно 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-11-02 21:15:00) [1]
Пробовал на разных машинах - результат везеде одинаковый. Я просто неудачный пример привел. Если в этот пример ниже добавить любые несколько строк, то и будет та ситуация, которую я пытаюсь разрулить. Вот 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 пишет в первой строке меня так сильно и интересует...
sniknik (2003-11-02 00:38:00) [2]
вот я про тоже, вроде бы и разници никакой нет. (во всяком случае мне не удалось получить)
случайно не на разных машинах пробовал? в смысле может ADO старой версии действительно не так выдает(?)
lmatveev (2003-11-01 21:32:00) [3]
Только что еще раз попробовал свой же пример и получил "Line 5: Incorrect syntax near "ectvvuyv"" !? Т.е. совсем не то, что в прошлый раз...
lmatveev (2003-11-01 21:17:00) [4]
> 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 я не разбирался, т.к. мне это принципиально не подходит, а ради спортивного интереса некогда...
sniknik (2003-11-01 19:51:00) [5]
да еще, то что в ODBC есть ODBC API функции я в курсе, интересно былобы с примером. (на предмет а действительно ли они возвращают? то что нужно)
подозрение есть что это не так, у него же не собственный "разборщик" синтаксиса, знает только то что ему в свою очередь SQL сервер дает.
sniknik (2003-11-01 19:47:00) [6]
> А вот все что можно вытянуть из 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:45:00) [7]
lmatveev (31.10.03 19:53) [14]
попробовал пример, ADO выдает
Line 5: Incorrect syntax near "ectvvuyv"
т.е. пока мне кажется, инфа анологичная.
lmatveev (2003-11-01 16:27:00) [8]
> Suntechnic © (01.11.03 05:46) [19]
Это я уже читал. Имеенно оттуда у меня цитата в первом сообщении. Вот вопрос то у меня как раз в том как через ADO достучаться до ISQLServerErrorInfo?
Suntechnic (2003-11-01 05:46:00) [9]
Вот здесь почитай подробнее:
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 03:19:00) [10]
Больше никто ничем не поможет?
lmatveev (2003-10-31 20:34:00) [11]
Кстати, нашел в библиотеке sdiclnt.dll интерфейсы ISqlDebugger, ISqlDebugHost, ISqlDebugEvent, ISqlDebugEventCallback...
Похоже, что это интерфейсы, испорльзуемые QA при вызове команды Debug для хранимой процедуры. Может кто знает как их использовать?
lmatveev (2003-10-31 20:04:00) [12]
> Юрий Жуков (31.10.03 18:05) [13]
Никогда такими компонентами не пользовался, но думаю, чтобы узнать номер строки с ошибкой, они должны быть скомпилены вместе с приложением. Т.к. в работающем приложении, на чем бы оно не было написано НЕТ ИНФОРМАЦИИ о номерах строк исходников.
Возможно, добавив этот компонент на этапе компиляции они будут собирать информацию об исходниках или что-то в этом роде (типа Assert). В любом случае, наверное, можно будет в RunTime спросить у приложения в какой строке ошибка. Но при этом, в зависимости от настроения автора приложения, оно будет либо для всех ошибок выдавать эту информацию всегда, либо у приложения можно будет "спросить" детальную информацию об ошибке.
Раз уж MS SQL Server не выдает эту информацию в каждом сообщении, меня интересует как его об этом спросить. Ну то есть это немного сложнее, но общий смысл такой
lmatveev (2003-10-31 19:54:00) [13]
> lmatveev (31.10.03 19:53) [14]
> Типа SQLGetDiagRec, SQLGetDiagield и т.п. В частности SQLGetDiagield ...
>
Здесь вместо SQLGetDiagield надо читать SQLGetDiagField
lmatveev (2003-10-31 19:53:00) [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
Юрий Жуков (2003-10-31 18:05:00) [15]
Немного не по теме, но в Работающем приложении Delphi можно легко узнать в какой строке произошла ошибка. И компонет таких с десяток можно найти. Например
JCL (JEDI)
Eureka Exception log
sniknik (2003-10-31 15:48:00) [16]
заодно и метод как узнать через ODBC, у меня сообщения мало чем отличаются (в онформационной части)
на вышеприведенный запрос
ADO
Invalid object name "NothingTable"
ODBC
[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name "NothingTable"
sniknik (2003-10-31 15:45:00) [17]
тогда дай пример запроса который там распознается а ADO нет.
lmatveev (2003-10-31 15:31:00) [18]
Ну это уже проблема сервера - он видимо всю команду в батче воспринимает как одну строку. Видимо надо сказать > А QA ПОЧТИ всегда узнает номер строки, но не только когда ее номер содержится в тексте ошибки.
sniknik (2003-10-31 15:17:00) [19]
> А QA всегда узнает номер строки.
не скажи
SELECT *
FROM
NothingTable --Несуществующая таблица
выдал
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name "NothingTable".
lmatveev (2003-10-31 15:12:00) [20]
В этом случае передается просто текст ошибки, который в ДАННОМ случае содержит номер строки. А QA всегда узнает номер строки. И узнает он это не из текста ошибки.
Дело в том, что QA использует для подключения к серверу ODBC драйвер, а через ODBC эту инфу получить можно. Я даже знаю как.
Но мне нужно узнать это через ADO+OLE DB Provider for SQL Server...