我有一个使用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查询),一切都很好。
对此有何解释?
答案 0 :(得分:0)
SQL Compact引擎中的一个错误 - 您是否使用最新版本的SQL CE?