Tenho certeza de que qualquer um de nós que já fez algum trabalho de desenvolvimento em um banco de dados, e quem não fez, encontrou este erro, ‘String ou dados binários seriam truncados’. Este é realmente um aviso mais do que um erro, mas irá interromper qualquer inserção de operação de atualização inoperante em suas trilhas se os avisos ANSI estiverem ativados, o que normalmente acontece. O verdadeiro problema é rastrear qual coluna está causando o problema, que quando você tem uma ou duas colunas não é um problema muito grande. Mas normalmente haverá mais colunas envolvidas, tornando isso difícil.
O problema ocorre quando você tenta adicionar ou alterar o valor de um campo baseado em caracteres e o valor tem mais caracteres do que o alocado para o campo. O outro problema pode ser quando você está tentando armazenar um valor binário, como um arquivo, em um campo pequeno demais para armazená-lo. Basicamente, o problema é que você está tentando armazenar dados muito grandes!
Danny demonstra uma técnica muito boa para rastrear o campo que está causando o aviso de truncamento, http://sqlblogcasts.com/blogs/danny/archive/2008/01/12/scuffling-with-string-or-binary-data-would-be-truncated.aspx . Recomendo visitar esse artigo para aprender mais sobre como lidar com isso no SQL Server.
Primeiro, deixe-me dizer, você deve validar o tamanho da sua string ou valor antes de tentar armazená-la no banco de dados. A validação do cliente é uma coisa, mas é claro que pode ser impedida pela maioria dos hackers. O objeto de negócios deve impor quaisquer limites de tamanho. Eu normalmente verifico isso em uma propriedade chamada IsValid que uso em cada um dos meus objetos de negócios. Eu admito que não sou o mais consistente com isso, mas eu uso quando sei que pode ser um problema.
Neste exemplo, eu uso uma combinação de métodos de verificação de dados para garantir que minhas strings estejam dentro da tolerância. Neste exemplo, tenho uma entidade de evento que precisa ter três campos, Título de 1 a 100 caracteres, Descrição de pelo menos 1 caractere e uma Data do evento que é mais do que o valor mínimo de Data, validado antes de ser considerado uma entidade válida.
Público
Somente leitura
Propriedade
IsValid ()As
Booleano
Implementos
IBaseEntity.IsValidGet
If
Helpers.IsValidString (Me
.EventTitle, 1, 100)E
_String
.IsNullOrEmpty (Eu
.EventDesc)=False
E
_Eu
.EventDate>Data
.MinValueEntão
Return
True
Final
Se
Retornar
Falso
Fim
Obter
Fim
Propriedade
O campo Descrição mapeia para um campo ntext, por isso pode ser grande, mas quero que tenha pelo menos algo nele. O String.IsNullOrEmpty (vale a pena pular para o 2.0 CLR se você ainda estiver 3 anos atrás sozinho!) É um dos meus métodos favoritos para validar uma string.
As datas são um situação complicada e eu normalmente uso a classe SmartDate do CSLA para contorná-los. Mas, neste caso, apenas ter certeza de que tenho algo mais do que o valor mínimo permitido para uma data é aceitável. Acho que, honestamente, você poderia definir algum tipo de valor mínimo na configuração do aplicativo, mas para isso vou deixar como está.
Finalmente, tenho uma classe Helper em uso neste projeto. Ele contém uma série de métodos compartilhados (estáticos para o pessoal do C #) que são usados para uma variedade de coisas. Nesse caso, tenho um método chamado IsValidString . Ele recebe um valor de string, um valor mínimo e máximo e determina se os critérios de comprimento são atendidos.
Público
Compartilhado
Função
IsValidString (ByVal
vValueAs
String
,ByVal
vMaxAs
Inteiro
)As
Booleano
Retorno
IsValidString (vValue, 0, vMax)End
Função
Pública
Compartilhada
Função
IsValidString (ByVal
vValueAs
String
,ByVal
vMinAs
String
,ByVal
vMaxAs
Inteiro
)As
Booleano
Se
vMin> 0Então
If
String
.IsNullOrEmpty (vValue) AndAlso vMin <=vValue.LengthEntão
Retorno
Falso
Fim
Se
Fim
Se
If
vMaxEntão Return
False
Fim
If
Retornar
Verdade
Final
Função
Agora, antes que eu comece a sair commen ts sobre métodos de extensão, eu sei. Deixe-me abordá-los em outra postagem.
Esses conceitos podem ser estendidos para criar uma grande série de métodos de validação que são gerais ou muito específicos para seu aplicativo. Também quero salientar que isso pode ser estendido ainda mais para incluir validações de formato, como e-mail, números de telefone e senhas. Isso é importante porque mais importante que um potencial truncamento de um valor é o potencial para um ataque de injeção SQL. Uma boa validação deve estar sempre em jogo para evitar um possível hack.
Tenho outra postagem em andamento para continuar estendendo esses conceitos, fique atento!