我有一个使用Linq to Sql和Sql Compact的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()