2010-09-08 33 views
15

La cadena o los datos binarios se truncarán. excepción de linq, no se puede encontrar qué campo ha excedido la longitud máxima."Cadena o datos binarios se truncarán". excepción de linq, no se puede encontrar qué campo ha excedido la longitud máxima

tengo alrededor de 350 campos. Comprobé todas las textbox maxlength con el campo de base de datos maxlength, todo parece ser correcto, pero aún así recibo la excepción.

favor ayuda

+0

compruebe el enlace actualizado –

+0

No olvide marcar la respuesta como aceptada si obtuvo la información que desea –

Respuesta

30

solucionar este error con 350 campos puede ser extremadamente difícil, y SQL Server no es de mucha ayuda en este caso (la búsqueda de la cadena larga en el SQL generado es como encontrar una aguja en un pajar).

Por lo tanto, aquí hay una forma automatizada de para encontrar las cadenas reales que exceden el límite de tamaño de la base de datos. Esta es una solución que está disponible en internet, en varias formas. Probablemente no desee dejarlo en su código de producción, ya que la búsqueda de atributo/propiedad es bastante ineficiente, y agregará gastos adicionales en cada guardado. Simplemente lo lanzaría en tu código cuando encontraras este problema, y ​​lo eliminaría cuando termines.

Cómo funciona: itera sobre todas las propiedades de un objeto que está a punto de guardar, la búsqueda de las propiedades con un LINQ a SQL ColumnAttribute. Entonces, si el ColumnAttribute.DbType contiene "varchar", usted sabe que es una cadena y puede analizar esa parte del atributo para encontrar la longitud máxima.

Así es como se usa:

foreach (object update in context.GetChangeSet().Updates) 
{ 
    FindLongStrings(update); 
} 

foreach (object insert in context.GetChangeSet().Inserts) 
{ 
    FindLongStrings(insert); 
} 

context.SubmitChanges(); 

Y aquí está el método:

public static void FindLongStrings(object testObject) 
{ 
    foreach (PropertyInfo propInfo in testObject.GetType().GetProperties()) 
    { 
     foreach (ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(ColumnAttribute), true)) 
     { 
      if (attribute.DbType.ToLower().Contains("varchar")) 
      { 
       string dbType = attribute.DbType.ToLower(); 
       int numberStartIndex = dbType.IndexOf("varchar(") + 8; 
       int numberEndIndex = dbType.IndexOf(")", numberStartIndex); 
       string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex)); 
       int maxLength = 0; 
       int.TryParse(lengthString, out maxLength); 

       string currentValue = (string)propInfo.GetValue(testObject, null); 

       if (!string.IsNullOrEmpty(currentValue) && maxLength != 0 && currentValue.Length > maxLength) 
        Console.WriteLine(testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength); 

      } 
     } 
    } 
} 
+0

gracias! ¡Estaba buscando ese código por años! (bien al menos un año ...) –

+3

Carta de 4 años y todavía muy útil. ¡Gracias! – c0bra

+1

ahora 7 años después y sigue siendo muy útil. Gracias – Fuzzybear

3

Si marcó la longitud máxima de cada cuadro de texto a la longitud máxima de cada campo, es muy posible el error está pasando a través de un disparador. ¿Hay factores desencadenantes en la mesa?

+0

Si puede ejecutar el generador de perfiles SQL, puede obtener la instrucción sql que linq generó y ejecutar la declaración usted mismo. A continuación, puede obtener un mensaje de error más útil. – Nicholas

-3

configuro la longitud máxima para todos los 350 campos. supongo que esa es la única forma. gracias por su apoyo.

+1

Actualmente, la solución de shaunmartin debería ser la respuesta aceptada porque ayudará a otros usuarios. – xpereta

+0

Esta es una idea increíblemente mala desde la perspectiva de un DBA. Termina con consultas que obtienen más memoria de la que necesitan, y si está usando NVARCHAR (MAX) ya no puede indexar el campo. Echa un vistazo a esta publicación antes de considerar hacer esto: https://stackoverflow.com/questions/148398/are-there-any-disadvantages-to-always-using-nvarcharmax –

Cuestiones relacionadas