У меня есть приложение, использующее Entity Framework с базой данных SQL Server 2008 (Express).Я получаю периодически возникающую ошибку при обновлении сущности в базе данных, которая указывает, что «предоставленное значение не является допустимым экземпляром типа данных с плавающей запятой».Однако, насколько я могу судить, значения, которые он устанавливает, всегда будут плавающими.Они составлены из целых чисел, но даже все равно всегда будут давать плавающие числа.Если бы коду удалось как-то создать недопустимый объект с плавающей точкой, я бы подумал, что .NET пожалуется об этом еще до того, как он попадет на SQL Server.
Я включил полное исключение, выдержки из кода и схемуниже.
Могу ли я что-то упустить здесь - например, можно ли считать одно значение плавающей точкой в .NET, но не в SQL Server?В качестве альтернативы, есть ли какой-нибудь способ, которым я могу программно регистрировать точность и масштаб поплавка, чтобы я мог диагностировать, что происходит, если проблема возникнет снова?
Я добавил несколько дополнительных журналов, чтобы попытаться точно захватитьчто происходит здесь, но это периодически возникающая проблема, и я не могу воспроизвести ее сам.
Ошибка:
System.Data.UpdateException: при обновлении произошла ошибказаписи.Смотрите внутреннее исключение для деталей.--->
System.Data.SqlClient.SqlException: поток протокола удаленного вызова процедур (RPC) входящего потока табличных данных (TDS) неверен.Параметр 4 ("@ 1"): предоставленное значение не является допустимым экземпляром типа данных с плавающей запятой.Проверьте исходные данные на недопустимые значения.Примером недопустимого значения являются данные числового типа с масштабом, превышающим точность.
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
Вот код, который выполняется.(Обратите внимание, что класс Image является классом сущности из 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();
}
Извлечение схемы для таблицы, к которой это относится:
CREATE TABLE Image
(
ImageID uniqueidentifier NOT NULL PRIMARY KEY,
X float NOT NULL,
Y float NOT NULL
)
Также я должен отметитьчто модель EF использует тип данных Single для столбцов X и Y.