8
votes

SQLITE.NET TABLE QUERY Jette NullReferenceException

J'utilise la ligne de code suivante pour interroger certaines données d'une table donnée dans une base de données SQLite (la plate-forme est WP81 mais je suppose que cela n'a pas d'importance ici).

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


8 commentaires

Qu'entendez-vous par «NRE dans la clause Où»? Si cela compilait réellement dans un arbre d'expression et être traité comme tel, il ne devrait pas être possible pour la Lambda elle-même de jeter une exception, seul le code qui le traite. Avez-vous réellement une exception avant que "tolistasync" soit déjà appelé, sinon tu veux dire "si je suppose que, il n'y a pas d'exception" par ça?


Sont votre à partir de et à variables définis? Je vois aussi à ici ne possède pas de @ . Et avez-vous NULL date S dans jour de travail ?


@MPelletier Oui. J'ai vérifié à l'aide du débogueur que, de et d'avoir une valeur. Du a le @ parce qu'il est également un mot clé en C # et il n'est donc généralement pas autorisé à utiliser une variable avec ce nom.


@Mattivirkkunen exactement. Lorsque je retire la méthode où (), tout fonctionne bien. J'ai aussi ajouté la trace de la pile maintenant. Vous pouvez voir qu'il échoue à CompileExpr, ce que j'ai tendance à croire se réfère à l'expression. Peut-être qu'il y a un meilleur moyen de regarder cette erreur?


@Stephan: Il semble qu'il n'y ait que quelques fichiers source impliqués dans cette bibliothèque, donc si vous copiez temporairement celles-ci dans votre projet au lieu d'utiliser une DLL, vous pouvez déboguer dans compileeexpr et voir exactement ce qui se casse exactement.


Qu'en est-il des dates nulles dans votre table?


@MPelletier Nope. Vérifié que, en téléchargeant la base de données à partir de l'émulateur Windows Phone à l'aide de l'administrateur SQLITE Isetool et utilisée pour consulter la table. Toutes les entrées (juste quelques entrées de test) ont tous une date attribuée. Aucune valeur null là-bas.


Que se passe-t-il si votre clause ressemble à ceci :.. Où (wd => wd! = Null && wd.date> = @from && wd.date <= to)? Tout comme une enquête .. En outre, votre correctif semble sous-optimal, lorsque vous tirez tout à partir de votre table de travail, puis filtrez-la ensuite.


3 Réponses :


1
votes

Peut-être que je suis trop nouveau pour savoir ce que je parle de ce dont je parle, mais je pense que votre dernier exemple a eu besoin d'un attendre code> instruction avant votre tolistasync code> appel.

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


1 commentaires

Malheureusement, je ne peux plus tester cela comme j'utilise une autre base de données maintenant au lieu de SQLite (iboxdb). Mais je suis sûr que je suis sûr que Visual Studio se plaint au cas où j'essaierais d'accéder à un résultat de la tâche avec ASYNC là-bas. Mais je peux me tromper.



2
votes

Je suis tout à fait sûr que vous ne travaillez plus dans ce projet, mais je vais y répondre car cela peut aider quelqu'un qui lutt toujours avec ce problème.

Le problème est votre entité Et je ne sais pas quel est le problème exactement parce que vous n'avez pas publié votre classe ici. Mais fondamentalement, vous essayiez probablement d'accéder à une propriété qui n'a pas encore été récupérée de votre base de données. Par exemple, j'ai une classe avec deux propriétés: p>

public class MyClass
{
      public DateTime Date { get; set; } // You're saving this property in the database
      public bool IsLate => Date < DateTime.Today; // This property is not be saving, and probably is the cause of your exception
}


2 commentaires

J'avais ce même problème et c'était comme vous l'avez suggéré. Cependant, plutôt que de convertir des valeurs informatiques à une liste, alors exécutez une requête sur celle-ci, je pensais faire: Query.Asenumerable (). Où (....) Comme (...) comme étant émettant paresseusement, toute la table n'a pas besoin d'être récupérée. . Mon hypothèse est-elle correcte?


Je ne sais pas si cela résoudrait résoudre votre problème, car SQLite fonctionne différemment du cadre d'entité que je crois. La raison pour laquelle vous pouvez faire cela en utilisant EF est parce que DBContext implémente IQuiserable, mais ce n'est pas le cas en utilisant SQLite.



0
votes

Ajouter un peu plus de détails à Daniel Cunha Répondre J'ai ceci dans ma classe CProduct xxx

cette requête produit.product = dbconnection.table (). Où (S => S.ROWID == produit.productid) .Firstordefault ();

EXCEPTION DE RÉFÉRENCE NULL

PRODUCT.PRODUCT = DBConnection.Table (). Où (S => S.Id == Produit.Productid) .Firstordefault (); < /p >p>.id Vous ne pouvez pas utiliser dans la requête de DB. Il n'y a pas de tel champ dans la table.


0 commentaires