实体框架SQL异常:提供的值不是数据类型float的有效实例



我有一个使用实体框架与SQL Server 2008 (Express)数据库的应用程序。我得到一个间歇性的错误,而做更新数据库中的实体,这表明"提供的值不是数据类型浮动的有效实例"。然而,据我所知,它所设置的值将始终是浮点数。它们是从整数强制转换而来,但仍然总是产生浮点数。如果代码确实设法以某种方式创建了一个无效的浮点数,我本以为。net会在它到达SQL Server之前抱怨它。

我在下面包含了完整的异常、代码摘录和模式。

有什么我可能会错过这里-例如,单一值可以被认为是一个浮动在。net,而不是在SQL Server?或者,是否有任何方法可以通过编程记录浮点数的精度和比例,以便我可以诊断问题再次出现时发生了什么?

我已经添加了一些额外的日志记录,试图准确地捕捉这里发生的事情,但这是一个间歇性的问题,我不能自己重现它。

错误是:

System.Data。UpdateException:更新表项时发生错误。有关详细信息,请参阅内部异常。——>

System.Data.SqlClient。SqlException:传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。参数4("@1"):提供的值不是数据类型float的有效实例。检查源数据中的无效值。无效值的一个例子是比例大于精度的数字类型的数据。

 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:CodeImageProcessing.cs:line 224

下面是正在执行的代码。(注意,图像类是实体框架中的实体类。)

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模型对X和Y列使用数据类型Single。

我得到了完全相同的错误。其实我是在用一个浮点数除以0。在我做除法的时候,这并没有在代码中抛出异常;当我试图在数据库中保存这个值时,我得到了错误。

希望这对你们中的一些人有帮助-感谢John提出这个问题。

好吧,你已经提到你正在尝试将int赋值给float。尝试通过乘以1.0将其转换为float

   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

最新更新