атрибуты 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, см. в этой функции.