Pergunta

Eu gostaria de obter o número da mensagem e as informações do nível de gravidade do SQL Server após a execução de uma consulta errônea.

Por exemplo, quando um usuário tenta excluir uma linha que está sendo referenciada por outro registro, e o relacionamento em cascata é "sem ação", gostaria que o aplicativo pudesse verificar a mensagem de erro 547 ("A declaração de exclusão conflitou com o Restrição de referência ... ") e retorne uma mensagem amigável e localizada ao usuário.

Ao executar essa consulta diretamente no SQL Server, a seguinte mensagem é impressa:

Msg 547, Level 16, State 0, Line 1
<Error message...>

Em um aplicativo ASP.NET, essas informações estão disponíveis em um parâmetro de manipulador de eventos ou em outro lugar?

Além disso, não acho que alguém saiba onde posso encontrar uma referência definitiva dos números de mensagens do SQL Server?

Foi útil?

Solução

Claro - confira o SQLEXCECCIONE Isso é jogado é algo errado no SQL Server.

Ele contém uma coleção de SQLERROR elementos, que contêm um monte de propriedades, incluindo

  • Class Obtém o nível de gravidade do erro retornado do SQL Server.
  • LineNumber Obtém o número da linha no lote de comando transact-sql ou no procedimento armazenado que contém o erro.
  • Message Recebe o texto descrevendo o erro.
  • Number Obtém um número que identifica o tipo de erro.
  • Procedure Obtém o nome do procedimento armazenado ou Chamada de Procedimento Remoto (RPC) que gerou o erro.
  • Server Obtém o nome da instância do SQL Server que gerou o erro.
  • Source Obtém o nome do provedor que gerou o erro.
  • State Obtém um código de erro numérico do SQL Server que representa uma mensagem de erro, aviso ou "nenhum dado encontrado".

Outras dicas

tente isso para ver o que são todas as mensagens

SELECT *
FROM master.dbo.sysmessages

As mensagens de erro do SQL Server estão localizadas em master.dbo.sysmessages

No ASP.NET, se você pegar a exceção como uma SQLEXCECTION, o número e a mensagem de erro estarão disponíveis.

Eu acho que é uma boa prática iterar através dos erros do SQL, pois pode haver mais de um

(não testado)

try
{
// Do some stuff here
}
catch (SQLException sqlex)
{
foreach (SqlError error in sqlex.Errors)
{
Console.WriteLine(error.Number.ToString());
Console.WriteLine(error.Message.ToString());
}
}
catch (Exception ex)
{
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top