1

Linq to Sql with Sql Compact を使用する Windows Phone アプリがあります。私の Item テーブルには、一部の 10 進数値や null 許容の 10 進数値など、さまざまなフィールド タイプがあります。

エミュレーターでテストするとき、起動時にバックグラウンド スレッドで Item テーブルを読み取り、メイン ページの ListBox に入力すると、未処理の ArgumentException が発生します。

精度値 '29' が 0 未満であるか、許容される最大精度の 38 を超えています。

これは断続的で、おそらくプロジェクトをデバッグする 15 ~ 20 回に 1 回ですが、常に「29」です。物理デバイスでこのエラーが発生したことはありませんが、まだ十分なテストを行っていません。

なぜこうなった?Web を検索してみましたが、このエラーが表示されるたびに、精度の値が実際に 38 を超えています。これを try-catch ブロックでラップできると思っていましたが、実際には問題は解決しません。です。これはデータベースにデータがある場合に発生しますが、新しい空のデータベースでも発生します。データが存在する場合の実際の 10 進数値は非常に低くなります (一部は通貨であり、一部は重量と寸法です)。

エラーから続行すると、通常、デバッグは正常に機能します。

スタックトレース:

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