Registos e Campos de Diagnóstico

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse Analytics

Os registos de diagnóstico estão associados ao ambiente, ligação, instrução ou handles de descritores ODBC. Quando qualquer função ODBC gera um código de retorno diferente de SQL_SUCCESS ou SQL_INVALID_HANDLE, o handle chamado pela função tem registos de diagnóstico associados que contêm mensagens informativas ou de erro. Estes registos são mantidos até que outra função seja chamada usando esse handle, altura em que são descartados. Não há limite para o número de registos de diagnóstico que podem ser associados a um handle em qualquer momento.

Existem dois tipos de registos diagnósticos: cabeçalho e estado. O registo do cabeçalho é o registo 0; Quando existem registos de estado, são registos 1 e posteriores. Os registos de diagnóstico contêm campos diferentes para o registo de cabeçalho e para os registos de estado. Os componentes ODBC também podem definir os seus próprios campos de registo de diagnóstico.

Os campos no registo de cabeçalho contêm informações gerais sobre a execução de uma função, incluindo o código de retorno, contagem de linhas, número de registos de estado e tipo de instrução executada. O registo de cabeçalho é sempre criado, a menos que uma função ODBC devolva SQL_INVALID_HANDLE. Para uma lista completa de campos no registo do cabeçalho, veja SQLGetDiagField.

Os campos nos registos de estado contêm informações sobre erros ou avisos específicos devolvidos pelo Gestor de Drivers ODBC, driver ou fonte de dados, incluindo o estado SQL, número de erro nativo, mensagem de diagnóstico, número de coluna e número de linha. Os registos de estado são criados apenas se a função devolver SQL_ERROR, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_NEED_DATA ou SQL_STILL_EXECUTING. Para uma lista completa de campos nos registos de estado, veja SQLGetDiagField.

O SQLGetDiagRec recupera um único registo de diagnóstico juntamente com o seu ODBC SQLSTATE, número de erro nativo e campos de mensagem de diagnóstico. Esta funcionalidade é semelhante à do ODBC 2. xfunção SQLEror . A função de gestão de erros mais simples no ODBC 3. x deve chamar repetidamente SQLGetDiagRec começando com o parâmetro RecNumber definido em 1 e incrementando RecNumber em 1 até que SQLGetDiagRec retorne SQL_NO_DATA. Isto é equivalente a um ODBC 2. x aplicação a chamar SQLError até que este retorne SQL_NO_DATA_FOUND.

ODBC 3. x suporta muito mais informação diagnóstica do que o ODBC 2. x. Esta informação é armazenada em campos adicionais em registos de diagnóstico recuperados através do SQLGetDiagField.

O driver ODBC do SQL Server Native Client tem campos de diagnóstico específicos do driver que podem ser recuperados com SQLGetDiagField. Os rótulos para estes campos específicos do driver são definidos em sqlncli.h. Use estas etiquetas para recuperar o estado do SQL Server, nível de gravidade, nome do servidor, nome do procedimento e número de linha associados a cada registo de diagnóstico. Além disso, sqlncli.h contém definições dos códigos que o driver utiliza para identificar Transact-SQL instruções se uma aplicação chamar SQLGetDiagField com DiagIdentifier definido como SQL_DIAG_DYNAMIC_FUNCTION_CODE.

O SQLGetDiagField é processado pelo ODBC Driver Manager usando a informação de erro que armazena em cache do driver subjacente. O ODBC Driver Manager não armazena em cache campos de diagnóstico específicos do driver até que uma ligação tenha sido bem-sucedida. O SQLGetDiagField retorna SQL_ERROR se for chamado para obter campos de diagnóstico específicos do driver antes de uma ligação bem-sucedida ter sido concluída. Se uma função de ligação ODBC devolver SQL_SUCCESS_WITH_INFO, os campos de diagnóstico específicos do driver para a função de ligação ainda não estão disponíveis. Só pode começar a chamar SQLGetDiagField para campos de diagnóstico específicos do driver depois de ter feito outra chamada de função ODBC após a função de conexão.

A maioria dos erros reportados pelo driver ODBC do SQL Server Native Client pode ser eficazmente diagnosticada apenas com a informação devolta pelo SQLGetDiagRec. Em alguns casos, no entanto, a informação devolvida pelos campos de diagnóstico específicos do driver é importante para diagnosticar um erro. Ao programar um gestor de erros ODBC para aplicações usando o driver ODBC SQL Server Native Client, é também uma boa ideia usar SQLGetDiagField para recuperar pelo menos os campos SQL_DIAG_SS_MSGSTATE e SQL_DIAG_SS_SEVERITY específicos do driver. Se um erro específico puder ser apresentado em vários locais do código SQL Server, SQL_DIAG_SS_MSGSTATE indica a um engenheiro de suporte Microsoft especificamente onde foi apresentado um erro, o que por vezes ajuda a diagnosticar um problema.