2014-09-30 27 views
7

'u atar Bir SQLite veritabanındaki belirli bir tablodan bazı verileri sorgulamak için aşağıdaki kod satırını kullanıyorum (platform WP81'dir ama sanırım bu önemli değil).SQLite.net tablo sorgusu NullReferenceException

return await Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to).ToListAsync().ConfigureAwait(false); 

Kodumu çalıştırdığımda, Where cümlede bir NullReferenceException alıyorum. Nerede her şeyin iyi çalıştığını kaldırdığımda. benim tablodaki tüm kayıtlar geçerlidir ve ben SQLite veritabanına bakmak için bir SQL aracı kullanılan Tarihi sütunundaki hiçbir boş değer olmadığından emin olmak için

return await Connection.Table<WorkDay>().ToListAsync().ConfigureAwait(false); 

.

Lambda ifadelerinde hata ayıklayamadığım için, sorunu nasıl bulacağımı bilmiyorum. Benim varsayımım, async kullanımından dolayı bir şeylerin yanlış gitmesi.

Düzenleme:

Daha biraz etrafına oynanan ve aşağıdaki anladım: Burada istisna

{System.NullReferenceException: Object reference not set to an instance of an object. 
    at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs) 
    at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs) 
    at SQLite.Net.TableQuery`1.CompileExpr(Expression expr, List`1 queryArgs) 
    at SQLite.Net.TableQuery`1.GenerateCommand(String selectionList) 
    at SQLite.Net.TableQuery`1.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at SQLite.Net.Async.AsyncTableQuery`1.<ToListAsync>b__0() 
    at System.Threading.Tasks.Task`1.InnerInvoke() 
    at System.Threading.Tasks.Task.Execute() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() 
    at TimeStamp.Core.Services.DataService.<GetWorkDays>d__c.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at TimeStamp.Core.ViewModel.MainViewModel.<LoadWorkDays>d__1a.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state)} 

Düzenleme 2'nin tam StackTrace olduğunu.

var query = Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to); return query.ToListAsync().ConfigureAwait(false); 

aslında yerine nerede yöntemin ToListAsync() yönteminde kırar bu deyimi yürütme. Ancak, bu da işe yaramıyor. Daha sonra çalışmakta olan aşağıdakileri denedim.

var result = await Connection.Table<WorkDay>().ToListAsync().ConfigureAwait(false); 
return result.Where(wd => wd.Date >= @from && wd.Date <= to).ToList(); 

Yaptığım şey, aslında Nerede yöntemini ayırmaktır. Ama bu benim için işe yarıyorsa da, soruma cevap vermiyor çünkü neden bunun işe yaramadığını merak ediyorum.

+0

"NRE, nerede" cümlesi ile kastediliyor? Aslında bir ifade ağacında toplanıyor ve bu şekilde işleniyorsa, lambda'nın kendi başına bir istisna atması mümkün olmamalı, sadece onu işleyen kod. Aslında "ToListAsync" den önce bir istisna var mı, yoksa sadece "Nereden Çıkarsam, bunun bir istisnası yok" mu demek istediniz? –

+0

'from' ve' to' değişkenleri tanımlanmış mı? Ben de '' '' in '' ''inin olmadığını görüyorum. ve 'WorkDay' içinde null 'Date's var mı? – MPelletier

+0

@MPelletier Evet. Hata ayıklayıcısını kullanarak, hem değer hem de bir değeri olup olmadığını kontrol ettim. from @ değerine sahiptir, çünkü C# içinde bir anahtar kelimedir ve bu nedenle bu isimle bir değişkenin kullanılmasına genellikle izin verilmez. – Stephan

cevap

1

Belki de neden bahsettiğimi bilmek için çok yeni, ama son örneğinizin sadece bildirimine ToListAsync aramanızdan önce ihtiyaç duyduğunu düşünüyorum.

var query = Connection.Table<WorkDay>().Where(wd => wd.Date >= @from && wd.Date <= to); 
return await query.ToListAsync().ConfigureAwait(false); 

birinci problemin özelliklerine Emin değilim, ama nerede ifadesi tamamen ToListAsync başka bir iş parçacığı üzerinde çağırmadan önce başlatıldı değil, ürettiğini, TableAsyncQuery nesne ile ilgili bir şey olduğunu düşünürdüm .

+0

Maalesef, artık SQLite (iBoxDB) yerine başka bir veritabanı kullandığım için bunu test edemiyorum. Ancak eminim ki Visual Studio, bir Görev sonucuna orada uyumsuzlukla dışarıdan girmeye çalışacağım için şikayet edecektir. Ama yanılmış olabilirim. – Stephan

İlgili konular