Поделиться через


атрибуты SQLSTATE

SQLSTATEs предоставляют подробные сведения о причине предупреждения или ошибки. SqlSTATEs в этом руководстве основаны на тех, которые находятся в спецификации ИНТЕРФЕЙСА командной строки ISO/IEF, хотя эти SQLSTATEs начинаются с обмена мгновенными сообщениями, относятся к ODBC.

В отличие от кодов возврата, SQLSTATEs в этом руководстве являются рекомендациями, а драйверы не требуются для их возврата. Таким образом, в то время как драйверы должны возвращать правильный SQLSTATE для любой ошибки или предупреждения, которые они могут обнаруживать, приложения не должны рассчитывать на это всегда происходит. Причины этой ситуации являются двумя кратными:

  • Неполность , хотя в этом руководстве содержится большое количество ошибок и предупреждений, а также возможные причины этих ошибок и предупреждений, оно не завершено и, вероятно, никогда не будет. Реализации драйверов просто сильно различаются. Любой указанный драйвер, вероятно, не возвращает все SQLSTATEs, перечисленные в этом руководстве, и может возвращать SQLSTATEs, не перечисленные в этом руководстве.

  • Сложность некоторых ядр субД - особенно реляционных ядров СУБД - возвращает буквально тысячи ошибок и предупреждений. Драйверы для таких обработчиков вряд ли сопоставляют все эти ошибки и предупреждения с SQLSTATEs из-за усилий, неустанности сопоставлений, большого размера результирующего кода и низкого значения результирующего кода, который часто возвращает ошибки программирования, которые никогда не должны возникать во время выполнения. Таким образом, драйверы должны сопоставить столько ошибок и предупреждений, сколько разумно, и обязательно сопоставить эти ошибки и предупреждения, на которых может основываться логика приложения, например SQLSTATE 01004 (усеченные данные).

Так как SQLSTATEs не возвращаются надежно, большинство приложений просто отображают их пользователю вместе с соответствующим диагностическим сообщением, которое часто настраивается на определенную ошибку или предупреждение, которое произошло, и машинный код ошибки. При этом редко возникает потеря функциональных возможностей, так как приложения не могут использовать логику программирования в большинстве SQLSTATEs в любом случае. Например, предположим , что SQLExecDirect возвращает SQLSTATE 42000 (синтаксическая ошибка или нарушение доступа). Если инструкция SQL, вызвавшей эту ошибку, жестко закодирована или создана приложением, это ошибка программирования, и код должен быть исправлен. Если инструкция SQL введена пользователем, это ошибка пользователя, и приложение выполнило все возможное, уведомив пользователя о проблеме.

Когда приложения выполняют базовую логику программирования в SQLSTATEs, они должны быть подготовлены к возврату SQLSTATE или для возврата другого SQLSTATE. Точно то, какие sqlSTATEs возвращаются надежно, можно использовать только на основе опыта работы с многочисленными драйверами. Однако общее руководство заключается в том, что SQLSTATEs для ошибок, возникающих в драйвере или диспетчере драйверов, в отличие от источника данных, скорее всего, будут возвращены надежно. Например, большинство драйверов, вероятно, возвращают SQLSTATE HYC00 (необязательный компонент не реализован), а меньше драйверов, вероятно, возвращают SQLSTATE 42021 (столбец уже существует).

Следующие sqlSTATEs указывают на ошибки или предупреждения во время выполнения и являются хорошими кандидатами, для которых требуется базовая логика программирования. Тем не менее, нет никаких гарантий, что все водители возвращают их.

  • 01004 (усеченные данные)

  • 01S02 (изменено значение параметра)

  • HY008 (операция отменена)

  • HYC00 (необязательная функция не реализована)

  • HYT00 (истекло время ожидания)

Функция SQLSTATE HYC00 (необязательно не реализована) особенно важна, так как это единственный способ, с помощью которого приложение может определить, поддерживает ли драйвер определенную инструкцию или атрибут подключения.

Полный список SQLSTATEs и возвращаемых им функций см . в приложении A: коды ошибок ODBC. Подробное описание условий, при которых каждая функция может возвращать определенную функцию SQLSTATE, см. в этой функции.