当Int64-Parameter接近Int64-MaxValue时,使用DbContext连接到SQL CE的SQL-Query参数导致溢出

时间:2015-04-10 11:50:14

标签: c# sql .net sql-server-ce entity-framework-6

我有一个使用Entity Framework 6.1和SQL CE的应用程序。

考虑使用以下SQL脚本,该脚本使用DbContext的Connection:

执行
SELECT CAST((table2.Int64No + 1) AS bigint) AS Int64No
FROM
  (SELECT MAX(table1.Int64No) AS Int64No
   FROM
     (SELECT MAX(Int64No) AS Int64No
      FROM TestEntities
      WHERE (Int64No > (@end - @start))
        AND (Int64No <= @end)
      UNION SELECT (@end - @start) AS Int64No) AS table1) AS table2
WHERE (table2.Int64No <= (@end - @start))

我们的想法是找到现有的最大值并返回下一个可用的值,但如果根本找不到任何条目,仍会返回一个值。 @end和@start也是Int64值。

一切正常,直到@start达到Int64.MaxValue附近的值。具体来说,我创建了一个调用SQL脚本的测试应用程序,@start为1,每个循环增加@end。有趣的是,当@end到达 9223372036854774273 (即Int64.MaxValue - 1534)时,查询会抛出异常:

  

{System.Data.SqlServerCe.SqlCeException(0x80004005):表达式   评估引起了溢出。 [功能名称(如果已知)=]
  在System.Data.SqlServerCe.Accessor.get_Value()at   System.Data.SqlServerCe.SqlCeDataReader.FetchValue(Int32 index)at   System.Data.SqlServerCe.SqlCeDataReader.IsDBNull(Int32 ordinal)at   System.Data.SqlServerCe.SqlCeDataReader.GetValue(Int32 ordinal)at   System.Data.SqlServerCe.SqlCeCommand.ExecuteScalar()at   DbParameterTest.MainWindow.ButtonBase_OnClick(Object sender,   RoutedEventArgs e)在c:\ Users \ pfch \ Documents \ Visual Studio中   2013 \项目\ DbParameterTest \ DbParameterTest \ MainWindow.xaml.cs:行   93}

当我重构调用并直接将参数插入SQL时(即不使用参数化SQL查询),一切都很好。

对此有何解释?

1 个答案:

答案 0 :(得分:0)

SQL Compact引擎中的一个错误 - 您是否使用最新版本的SQL CE?