"Inválido buffer recebidos do cliente ” mensagem de erro no log do SQL Server quando você usa classes de provedor do SQL Server .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 827366
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você usa uma classe do Microsoft .NET Framework SqlClient , você receber a seguinte mensagem de erro no log de erro do Microsoft SQL Server 2000:
Erro: 17805, gravidade: 20, estado: 3
Buffer inválido recebido do cliente.
Você recebe as seguintes mensagens de erro correspondente no aplicativo de cliente do Microsoft .NET Framework:
System.Data.SqlClient.SqlException: Ocorreu um erro grave no comando atual. Os resultados, se houver, devem ser descartados
Causa
Esse comportamento ocorre se uma das seguintes situações for verdadeira:
  • Você usa uma classe SqlClient em um método Finalize ou em um destruidor translation from VPE for Csharp .
  • Você não especificar uma enumeração SQLDbType explícita quando você cria um objeto SqlParameter . Quando você não especificar uma enumeração SQLDbType explícita, o Microsoft .NET Framework Data Provider para SQL Server (SqlClient) tenta selecionar a enumeração SQLDbType correta com base nos dados são passados. SqlClient não obtém êxito.
  • Declare uma instância da classe SqlClient para ser estáticos em translation from VPE for Csharp ou para ser compartilhado no Visual Basic. A instância pode ser acessada simultaneamente de mais de um thread no aplicativo.

    Observação No ambiente de ASP.NET ou em alguns outros ambientes, acesso simultâneo é possível mesmo se não há segmentos adicionais são criados explicitamente no código do aplicativo.
  • O tamanho do parâmetro que você especificar explicitamente no código do .NET Framework é mais do que o tamanho máximo que você pode usar para o tipo de dados no SQL Server.

    Por exemplo, de acordo com para SQL Server Books Online, nvarchar é um dados de caracteres de Unicode de comprimento variável de n caracteres. "n" deve ser um valor de 1 a 4000. Se você especificar um tamanho que é mais de 4000 para um parâmetro nvarchar , você receberá a mensagem de erro descrita na seção "Sintomas".
O código a seguir também demonstra como esses erros podem ocorrer:
Stored Procedure--------------------------CREATE PROCEDURE spParameterBug @myText Text AS            Insert Into ParameterBugTable (TextField) Values (@myText)Code-------static void Main(string[] args){       string dummyText=string.Empty;       for (int n=0; n < /*80*/ 3277; n++)   // change this to 80 to receive the second error that is mentioned earlier in this article.       {             dummyText += "0123456789";       }        // TO DO: Change data source to match your SQL Server:       SqlConnection con= new SqlConnection("data source=myserver;Initial Catalog=mydb;Integrated Security=SSPI;persist security info=True;packet size=16384");       SqlCommand cmd = new SqlCommand("SpParameterBug", con);      con.Open();           // Causes error 17805:      SqlParameter param2 =new SqlParameter("@myText", dummyText);      cmd.CommandType = CommandType.StoredProcedure;      cmd.Parameters.Add(param2);      try      {          cmd.ExecuteNonQuery();      }       catch (Exception err)      {         Console.WriteLine(err.ToString());      }      Console.ReadLine();}
Resolução
Para resolver esses erros, certifique-se que você faça o seguinte:
  • Não use uma classe SqlClient em um método Finalize ou em um destruidor translation from VPE for Csharp .
  • Especifique a enumeração SqlDbType para o objeto SqlParameter para que não há nenhum tipo inferido.
  • Especificar um tamanho de parâmetro está dentro dos limites do tipo de dados.
Referências
Para obter mais informações sobre o tamanho máximo para diferentes tipos de dados, visite o seguinte da Microsoft Developer Network (MSDN):

Propriedades

ID do Artigo: 827366 - Última Revisão: 12/08/2015 04:27:08 - Revisão: 3.4

Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbprb KB827366 KbMtpt
Comentários