c# - entityvalidationerrors - entity framework interceptor
Excepción de EF: los datos binarios o binarios se truncarán. La instrucción se ha terminado.? (5)
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
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 instrucción se ha 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();
}
Además, el enfoque sugerido para utilizar DbEntityValidationException (que solo está disponible en Entity Framework 5.0) no funciona, el bloque catch no captó la excepción.
try
{
ImportData();
}
catch (DbEntityValidationException ex)
{
foreach (var item in ex.EntityValidationErrors)
{
//...
}
}
La única solución que encontré hasta ahora es usar SQL Server Profiler y definir los siguientes eventos para monitorear:
Ahora puedo ver que el correo electrónico es demasiado largo.
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ía TRIM
cada campo de cadena en los datos brutos en el tamaño de campo correspondiente antes de intentar insertar.
Puede verificar los datos antes de guardarlos, utilizando metadatos EF, y generar el error apropiado. Por favor, consulte el siguiente enfoque: http://www.entityframework.info/Home/MetadataValidation
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.
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.