Как да получите достъп до допълнителна информация за грешките, върнати при използването на запаметени процедури за OLE автоматизация


Обобщена информация


Тези процедури за автоматизирана автоматизация се нуждаят от неограничен достъп до обектите, които искат да извикват, за да функционират правилно. Често възникват следните грешки, когато не съществуват неразрешени проблеми с обекта цел:
Microsoft [ODBC SQL Server Driver] Грешка в протокола в TDS поток [Microsoft] [ODBC SQL Server Driver] грешка при поредица от функции

Повече информация


Когато това се случи, може да има няколко основни проблема едновременно. В повечето случаи грешката на табличните данни (TDS) е по-голямата част от Общата грешка и освен ако не се занимавате с изпълнението на отдалечена услуга за данни (RDS), това няма да бъде много ясен указател към източника на проблема. За да повишите върнатата информация за грешка, трябва да заместите sp_oageterrorinfo разговор с обаждане до sp_displayoaerrorinfo. За да получите достъп до тази допълнителна информация, за която първо трябва да съберете двете доста удобни съхранени процедури, споменати в следната статия на SQL Server 7,0 Books Online:
   OLE Automation Return Codes and Error Information 
Статията обяснява и подробно защо тези съхранени процедури са необходими, за да извлечете допълнителна използваема информация, която не е обсъдена в тази статия. Когато сте съставили съхранените процедури, предшестващите грешки ще ви осигурят много по-използваема информация, както е показано в следния фрагмент от код, който използва модифицираната обработка на грешки, за да ни осигури много по-интересна производителност:
DECLARE @object intDECLARE @hr intEXEC @hr = sp_OACreate 'Nic.cls', @object OUTPUTIF @hr <> 0BEGIN    EXEC sp_displayoaerrorinfo @object, @hr--  EXEC sp_OAGetErrorInfo @object    RETURNEND
Това, което получаваме с разрешената sp_displayoaerrorinfo повиквания в този случай, изглежда по следния начин:
Съобщение за грешка в OLE автоматизация за HRESULT: 0x800401f3 източник: ODSOLE описание на разширената процедура: Невалиден низ за клас
В този пример забелязваме, че грешката "Невалиден низ от тип" може да означава, че ProgID или CLSID (NIC. CLS в предишния пример), отбелязан в sp_oacreate повикването, не е било успешно регистрирано като OLE обект на SQL Server. В нашия пример това е така, защото NIC. CLS е фиктивен обект. За повече информация относно тези типове грешки прегледайте документацията за sp_oaGetErrorInfo повикване в книги на SQL Server Online.In за да видите още малко от това, което се случва тук, добавете "изберете @hr" между IF и The BEGIN Recodes в кода по следния начин:
DECLARE @oFTP intDECLARE @hr int  DECLARE @vvar varchar(255)DECLARE @vout intEXEC @hr = sp_OACreate 'Nic.Inet', @object OUTPUTSELECT @hrIF @hr <> 0BEGIN    EXEC sp_displayoaerrorinfo @object, @hr--   EXEC sp_OAGetErrorInfo @object    RETURNEND
Това връща следната информация за грешка, както е разрешено преди това:
------------2147221005(1 row(s) affected) 
Съобщение за грешка в OLE автоматизация за HRESULT: 0x800401f3 източник: ODSOLE описание на разширената процедура: Невалиден низ за клас
Следва да се отбележи, че може да е изкушаващо просто да добавите @hr към EXEC sp_OAGetErrorInfo @object обаждане, което при опит наистина ще върне фалшив успех в резултат от успешно завършено изпълнение на командата. Все пак това всъщност не е това, което искаме, защото трябва да знаем защо получаваме ненулев резултат за @hr в кода.Забележка Ако използвате Microsoft SQL Server 2005, може да се наложи да промените леко този код. За повече информация вижте темата "OLE Automation return кодове и информация за грешка" в SQL Server 2005 Books online.