Діагностичні записи і поля

Діагностичні записи пов'язані з середовищем ODBC, з'єднанням, інструкцією або покажчиками дескриптора. Коли будь-яка функція ODBC повертає код повернення, відмінний від SQL_SUCCESS або SQL_INVALID_HANDLE, дескриптор, викликаний функцією, має пов'язані діагностичні записи, що містять інформаційні повідомлення або повідомлення про помилку. Ці записи зберігаються до тих пір, поки за допомогою даного дескриптора НЕ буде викликана інша функція, в цей момент запису скасовуються. Не існує обмеження на кількість діагностичних записів, що одночасно пов'язані з дескриптором.

Існує два типи діагностичних записів: заголовок і стан. Заголовна запис має номер 0; якщо є записи стану, то вони мають номери від 1 і далі. Діагностичні записи містять різні поля для заголовної запису і для записів стану. Компоненти ODBC можуть також визначати свої власні поля діагностичних записів.

Поля в головній записи містять загальні відомості про виконання функції, включаючи код повернення, число рядків, число записів стану і тип виконуваної інструкції. Заголовна запис створюється завжди, якщо тільки функція ODBC не повертає SQL_INVALID_HANDLE. Повний список полів в заголовній записи см. В розділі SQLGetDiagField.

Поля в записах стану містять відомості про конкретних помилки та попередження, що повертаються диспетчером драйверів ODBC, драйвером або джерелом даних, включаючи значення SQLSTATE, номер власної помилки, діагностичне повідомлення, номер стовпця і номер рядка. Записи стану створюються тільки в тому випадку, якщо функція повертає SQL_ERROR, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_NEED_DATA або SQL_STILL_EXECUTING. Повний список полів в записах стану див. Розділ SQLGetDiagField.

Функція SQLGetDiagRec отримує єдину діагностичну запис разом з її значенням ODBC SQLSTATE, номером власної помилки і полями діагностичного повідомлення. Ця функціональність подібна наявний в ODBC 2.x функції SQLError. Найпростіша функція обробки помилок в ODBC 3.x полягає в періодичному виклику SQLGetDiagRec. починаючи з завдання параметру RecNumber значення 1, потім параметр RecNumber збільшується на 1 до тих пір, поки функція SQLGetDiagRec не повернеться SQL_NO_DATA. Це еквівалентно виклику в додатку ODBC 2.x функції SQLError до тих пір, поки вона не поверне SQL_NO_DATA_FOUND.

ODBC 3.x підтримує набагато більше діагностичних відомостей, ніж ODBC 2.x. Ці відомості зберігаються в додаткових полях в діагностичних записах, одержуваних за допомогою функції SQLGetDiagField.

Драйвер ODBC для свого клієнта SQL Server містить специфічні для драйвера діагностичні поля, які можна отримати за допомогою функції SQLGetDiagField. Мітки для цих специфічних для драйвера полів визначаються у файлі sqlncli.h. За допомогою цих міток можна отримати стан SQL Server, ступінь серйозності, ім'я сервера, ім'я процедури і номер рядка, пов'язаний з кожної діагностичної записом. Також файл sqlncli.h містить визначення кодів, які використовуються драйвером для ідентифікації інструкцій Transact-SQL, якщо додаток викликає функцію SQLGetDiagField з заданим для параметра DiagIdentifier значенням SQL_DIAG_DYNAMIC_FUNCTION_CODE.

Функція SQLGetDiagField обробляється диспетчером драйверів ODBC за допомогою відомостей про помилку, кешованих з базового драйвера. Диспетчер драйверів ODBC НЕ кешируєт специфічні для драйвера діагностичні поля до того, як встановлено успішне з'єднання. Функція SQLGetDiagField повертає SQL_ERROR, якщо вона була викликана для отримання специфічних для драйвера діагностичних полів до того, як було завершено успішне з'єднання. Якщо функція з'єднання ODBC повертає SQL_SUCCESS_WITH_INFO, то специфічні для драйвера діагностичні поля ще не доступні для функції з'єднання. Функцію SQLGetDiagField для специфічних для драйвера діагностичних полів можна викликати після того, як буде зроблений виклик функції з'єднання і після неї виклик іншої функції ODBC.

Схожі статті