2014-09-30 8 views
7

फेंकता है मैं SQLite डेटाबेस में किसी दिए गए तालिका से कुछ डेटा पूछने के लिए कोड की निम्न पंक्ति का उपयोग कर रहा हूं (प्लेटफ़ॉर्म WP81 है लेकिन मुझे लगता है कि इससे कोई फर्क नहीं पड़ता)।SQLite.net तालिका क्वेरी NullReferenceException

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

जब मैं अपना कोड निष्पादित करता हूं तो मुझे खंड में एक NullReferenceException मिलता है। जब मैं कहां से हटा देता हूं सब कुछ ठीक काम करता है।

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

आदेश यकीन है कि मेरी तालिका में सभी प्रविष्टियों मान्य हैं और वहाँ तिथि कॉलम मैं एक एसक्यूएल उपकरण का उपयोग किया SQLite डेटाबेस पर गौर करने के लिए कोई शून्य मान है बनाने के लिए।

जैसा कि मैं लैम्ब्डा अभिव्यक्ति डीबग नहीं कर सकता हूं, मैं इस मुद्दे को कैसे ढूंढ सकता हूं इस पर अटक गया हूं। मेरी धारणा यह है कि एसिंक हैंडलिंग के कारण कुछ गलत हो गया है।

संपादित करें:

मैं थोड़ा अधिक के आसपास खेला और निम्नलिखित पता लगा: यहाँ अपवाद

{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)} 

संपादित 2 की सटीक स्टैकट्रेस है।

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

इस कथन को निष्पादित करते समय यह वास्तव में कहां विधि के बजाय ToListAsync() विधि में टूट जाता है। हालांकि, यह या तो मदद नहीं करता है।

बाद में मैंने निम्नलिखित काम करने की कोशिश की जो वास्तव में काम करता है।

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

तो मैंने वास्तव में कहां विधि को अलग करना है। लेकिन हालांकि यह मेरे लिए काम करता है, यह मेरे प्रश्न का उत्तर नहीं देता है क्योंकि मैं अभी भी सोच रहा हूं कि यह क्यों काम नहीं करता है।

+0

"जहां खंड में एनआरई" का मतलब है? यदि यह वास्तव में एक अभिव्यक्ति वृक्ष में संकलित है और इस तरह संसाधित किया जा रहा है, तो लैम्ब्डा के लिए अपवाद फेंकना संभव नहीं होना चाहिए, केवल कोड जो इसे संसाधित करता है। क्या आपको वास्तव में "ToListAsync" से पहले एक अपवाद मिलता है, या क्या आप इसका मतलब है "अगर मैं कहां हटा देता हूं, तो इसमें कोई अपवाद नहीं है"? –

+0

क्या आपके 'से' और 'से' चर परिभाषित हैं? मैं यहां 'to' भी देखता हूं जिसमें '@' नहीं है। और क्या आपके पास 'कार्यदिवस' में शून्य की तारीख है? – MPelletier

+0

@MPelletier हां। मैंने डीबगर का उपयोग करके जांच की है कि दोनों, मूल्य से और उसके पास हैं। से @ है क्योंकि यह सी # में एक कीवर्ड भी है और इसलिए आमतौर पर उस नाम के साथ एक चर का उपयोग करने की अनुमति नहीं है। – Stephan

उत्तर

1

शायद मैं यह जानकर बहुत नया हूं कि मैं किस बारे में बात कर रहा हूं, लेकिन मुझे लगता है कि आपके अंतिम उदाहरण को कॉल से पहले await कथन की आवश्यकता है।

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

पहली समस्या की बारीकियों पर सुनिश्चित नहीं हैं, लेकिन मैं इसे TableAsyncQuery वस्तु के साथ कुछ है, कि कहां बयान पैदा करता है, पूरी तरह से आरंभ नहीं किया जा रहा से पहले ToListAsync एक और धागा पर यह कहता है लगता होगा ।

+0

दुर्भाग्यवश, मैं अब और परीक्षण नहीं कर सकता क्योंकि मैं SQLite (iBoxDB) के बजाय अब एक और डेटाबेस का उपयोग कर रहा हूं। लेकिन मुझे पूरा यकीन है कि विजुअल स्टूडियो शिकायत करेगा अगर मैं वहां कार्य परिणाम तक पहुंचने का प्रयास करूंगा। लेकिन मैं गलत हो सकता है। – Stephan

संबंधित मुद्दे