Tengo una aplicación que utiliza Entity Framework con una base de datos SQL Server 2008 (Express). Recibo un error intermitente al realizar una actualización a una entidad en la base de datos que indica que 'el valor proporcionado no es una instancia válida del tipo de datos flotante'. Sin embargo, lo mejor que puedo decir, los valores que está configurando siempre serán flotantes. Se lanzan a partir de enteros, pero aún así siempre se producirán flotadores. Si el código se las arreglara para crear un flotador no válido de alguna manera, habría pensado que .NET se quejaría al respecto incluso antes de que llegara a SQL Server.
He incluido la excepción completa, los extractos de código y el esquema a continuación.
¿Hay algo que pueda faltar aquí? Por ejemplo, ¿podría un solo valor ser considerado un flotante en .NET pero no en SQL Server? Alternativamente, ¿hay alguna manera en que pueda registrar la precisión y la escala de un flotador mediante programación para poder diagnosticar lo que está sucediendo si el problema vuelve a surgir?
He agregado algunos registros adicionales para tratar de capturar exactamente lo que está pasando aquí, pero este es un problema intermitente y no puedo reproducirlo yo mismo.
El error es:
System.Data.UpdateException: se produjo un error al actualizar las entradas. Vea la excepción interna para más detalles. --->
System.Data.SqlClient.SqlException: La secuencia del protocolo de llamada a procedimiento remoto (RPC) de la secuencia de datos tabular (TDS) entrante es incorrecta. Parámetro 4 ("@ 1"): el valor suministrado no es una instancia válida del tipo de datos float. Compruebe los datos de origen para los valores no válidos. Un ejemplo de un valor no válido son datos de tipo numérico con una escala mayor que la precisión.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues) at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) --- End of inner exception stack trace --- at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Objects.ObjectContext.SaveChanges() at MyApplication.ImageProcessing.ProcessImage(Image image) in C:\Code\ImageProcessing.cs:line 224
Aquí está el código que se está ejecutando. (Tenga en cuenta que la clase de imagen es la clase de entidad de Entity Framework).
private static System.Random _randomLocation = new System.Random();
private void ProcessImage(Image image)
{
float x = _randomLocation.Next(668); // note: the System.Random.Next method always returns an int
float y = 0 - image.Height; // note: image.Height is an int and is always around 300-600 in value in this application
image.X = x;
image.Y = y;
_dataContext.SaveChanges();
}
El extracto de esquema para la tabla a la que se refiere esto es:
CREATE TABLE Image
(
ImageID uniqueidentifier NOT NULL PRIMARY KEY,
X float NOT NULL,
Y float NOT NULL
)
También debo tener en cuenta que el modelo EF utiliza el tipo de datos Single para las columnas X e Y.
Tengo exactamente el mismo error. Resulta que estaba dividiendo un flotador por cero. Esto no arrojó una excepción en el código en el momento en que hice la división; Cuando intenté guardar este valor en la base de datos, recibí el error.
Espero que esto sea útil para algunos de ustedes que leen la pregunta - Gracias John por plantearla.