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

Joh*_*ohn 16 types entity-framework sql-server-2008

我有一个使用Entity Framework和SQL Server 2008(Express)数据库的应用程序.我在对数据库中的实体进行更新时遇到间歇性错误,该实体指示"提供的值不是数据类型为float的有效实例".但是,正如我所知,它设置的值将永远是浮点数.它们是从整数投射出来的,但即便如此仍然会产生花车.如果代码确实设法以某种方式创建一个无效的浮点数,我会认为.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:\Code\ImageProcessing.cs:line 224
Run Code Online (Sandbox Code Playgroud)

这是正在执行的代码.(请注意,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();
}
Run Code Online (Sandbox Code Playgroud)

此引用的表的模式提取是:

CREATE TABLE Image
(
    ImageID uniqueidentifier NOT NULL PRIMARY KEY,
    X float NOT NULL,
    Y float NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

另外我应该注意,EF模型使用数据类型Single作为X和Y列.

Mar*_*ark 48

我得到了同样的错误.事实证明我将浮动除以零.在我进行划分时,这并没有在代码中引发异常; 当我试图在数据库中保存此值时,我收到了错误.

希望这对你们中的一些人阅读这个问题很有用 - 感谢John提出这个问题.

  • 这是事实,但很难捕捉到,因为双重变成了"NaN"而不是崩溃并且给你一个零失败!很难抓住.谢谢! (3认同)