1

我有一个使用带有 Sql Compact 的 Linq to Sql 的 Windows Phone 应用程序。My Item 表具有多种字段类型,包括一些十进制和可为空的十进制值。

在模拟器中进行测试时,在启动时并在后台线程中读取 Item 表以填充到主页上的 ListBox 中,我将得到一个未处理的 ArgumentException:

精度值“29”小于 0 或大于允许的最大精度 38。

这是间歇性的,也许每 15 到 20 次我调试项目一次,但它总是“29”。我还没有在物理设备上遇到这个错误,但我还没有在那里做太多的测试。

为什么会这样?我试过在网上搜索,但是我看到这个错误的每个实例,精度值确实大于 38。我想我可以将它包装在一个 try-catch 块中,但这并不能真正解决问题,无论如何这是。虽然当数据库有数据时会发生这种情况,但新的空数据库也会发生这种情况。数据存在时的实际十进制值非常低(有些是货币,有些是重量和尺寸)。

如果我从错误中继续,调试通常可以正常工作。

堆栈跟踪:

at System.Data.SqlServerCe.SqlMetaData.Construct(String name, SqlDbType dbType, Byte precision, Byte scale)
at System.Data.SqlServerCe.SqlMetaData..ctor(String name, SqlDbType dbType, Int64 maxLength, Byte precision, Byte scale, Int64 localeId, SqlCompareOptions compareOptions, Type userDefinedType)
at System.Data.SqlServerCe.MetaData..ctor(String name, SqlCeType typeMap, Byte precision, Byte scale, Int64 maxLength, String databaseName, String schemaName)
at System.Data.SqlServerCe.SqlCeDataReader.PopulateMetaData(Int32 columnCount, IntPtr prgColumnInfo)
at System.Data.SqlServerCe.SqlCeDataReader.FillMetaData(IntPtr pIUnknown)
at System.Data.SqlServerCe.SqlCeDataReader.FillMetaData(SqlCeCommand command)
at System.Data.SqlServerCe.SqlCeCommand.InitializeDataReader(SqlCeDataReader reader, Int32 resultType)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SqlServerCe.SqlCeCommand.ExecuteDbDataReader(CommandBehavior behavior)
at Microsoft.Phone.Data.Common.DbCommand.ExecuteReader()
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult, Boolean isCompiledQuery)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries, Boolean isCompiledQuery)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Linq.Enumerable.<TakeIterator>d__40`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Data.Item.List()
at Pages.Main.Thread_DoWork(Object sender, DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.OnRun(Object argument)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
4

0 回答 0