Pregunta Excepción de EF: los datos binarios o binarios se truncarán. La instrucción se ha terminado.?


He leído muchas publicaciones relacionadas con este tema, pero no he podido encontrar una respuesta. Estoy intentando cargar una gran cantidad de datos de Excel en SQL Server. Miles de registros. Y estoy obteniendo esta excepción:

Cadena o datos binarios podrían truncarse. La declaración ha sido   terminado.

Obviamente, algunos valores exceden el tamaño del campo en la base de datos. El error proviene de SQL Server AFIK.


Mi pregunta: ¿cómo podría saber qué registro y qué valor de campo causó esto?

No hay detalles específicos en la excepción de EF, excepto el que mencioné.

Cualquier ayuda es apreciada.

Algunos pidieron el fragmento de código, pero en realidad es muy simple, el problema no está en el código:

// employees is a List<Employee> collection loaded from Excel
using (var context = new Entities())
{
    employees.ForEach(e => context.Employee.AddObject(e));
    context.SaveChanges();
}

También el enfoque sugerido para usar DbEntityValidationException (que solo está disponible en Entity Framework 5.0) no funciona, el captura bloque no atrapó la excepción.

try
{
    ImportData();
}
catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //...
    }
}

La única solución que encontré hasta ahora es usar el Analizador de SQL Server, y definir los siguientes eventos para monitorear:

enter image description here

enter image description here

Ahora puedo ver que el correo electrónico es demasiado largo.


32
2017-11-14 14:41


origen


Respuestas:


catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //... inspect here 
    }
}

Puede encontrar la información que necesita dentro de foreach loop.

Espero que ayude.


5
2017-11-14 14:58



No puedes en ese nivel. SQL Server está rechazando toda la consulta.

Agregaría algunos controles previos a los datos contra las restricciones de su base de datos para el tamaño de cadena, formatos de fecha, etc.

Alternativamente podrías TRIM cada campo de cadena en los datos brutos para el tamaño de campo correspondiente antes de intentar insertar.


4
2017-11-14 15:02



Usted puede verificar los datos antes de guardando, usando los metadatos EF, y levanta el error apropiado. Por favor, compruebe el siguiente enfoque: http://www.entityframework.info/Home/MetadataValidation


1
2018-04-13 06:10



No estoy seguro acerca del truncamiento específicamente, pero este es un consejo para cuando recibe una excepción que le indica que examine EntityValidationErrors. Usualmente, al depurarlo no le permitirá ver esa propiedad (a menos que ya tenga una captura explícita). Sin embargo, puede abrir el reloj rápido y escribir $exception. Ahora debería poder perforar y encontrar esa propiedad. También puede escribir lo siguiente:

(System.Data.Entity.Validation.DbEntityValidationException)$exception

0
2018-03-09 14:34



private static string 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) && currentValue.Length > maxLength && lengthString!="max")
                        return testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength;

                }
            }
        }
        return "";
    }


foreach (object insert in dtx.GetChangeSet().Inserts)
            {
                string result = FindLongStrings(insert);
                if (string.IsNullOrEmpty(result) == false)
                {
                    responseBuilder.Append(result);
                }
            }

Si responseBuilder no está vacío, entonces contiene el nombre del campo, la longitud permitida y el mensaje de error.


0
2017-08-12 04:20