12
votes

Quand sqlcommand.executeraderader () renvoie NULL?

Lorsque vous utilisez appeler le sqlcommand.executereader () , Resharper me dit que j'ai une éventuelle exception de nullréférence lorsque j'utilise l'objet SqLDatreader après.

Ainsi, avec le code suivant: xxx

le tandis que (lecteur.read (lecture.dread ()) est souligné.

Ma question est quand l'objet de lecteur sera-t-il jamais nul ? Je ne l'ai jamais rencontré et la documentation ne mentionne pas que cela pourrait être. Devrais-je vérifier si c'est NULL ou est-il sûr d'ignorer?

Et pourquoi Resharper pense-t-il que cela pourrait être nul, quand, par exemple, cela me permet d'utiliser le SQLCOMMAND sans recommander qu'il soit vérifié pour NULL? Je suppose qu'il y a un attribut sur la méthode exécuterreader.


0 commentaires

5 Réponses :


2
votes

J'ai eu cette question avec eux dans quelques autres régions. Il semble qu'ils aient fait une analyse des chemins de code dans les différentes parties du CLR. Quand ils trouvent que cela est concevable de retourner NULL, c'est quand ils se plaignent de cela.

Dans le cas particulier que je me suis plaint, NULL ne pouvait pas réellement se produire. Cependant, ils ont suivi le graphe d'appel à une méthode qui pourrait renvoyer NULL, dans certaines circonstances et la valeur null pourrait éventuellement propager au sommet.

Donc, je l'appelle un bug de remorque (pensé que je l'ai déjà appelé un bug CLR).


0 commentaires

12
votes

C'est un faux positif.

réfléchissant sur sqldatareader.executerreader, je peux voir que la seule façon du lecteur est renvoyée comme NULL est si la méthode interne RunexecuterAder est passée "Faux" pour retour, ce qui n'est pas.

Dans les profondeurs de SqLDatreader, A Le constructeur de lecture est toujours appelé à un moment donné, alors je suis sûr que cela n'est pas physiquement possible pour exécuterAder de retourner NULL.


0 commentaires

1
votes

J'ai déterminé une raison pour laquelle exécuterAderader () peut renvoyer NULL.

Dans le cas où je recevais une null, j'avais envoyé un script de mon client pour mettre à jour une procédure stockée. Le serveur SQL (2000) de mon client (2000) est configuré pour que les utilisateurs de DB ont besoin d'une autorisation pour exécuter une procédure stockée. Lorsqu'ils ont mis à jour le SP, l'autorisation a été supprimée et non réaffectée. Dans ce cas, le SQLCOMMAND.EXECUTEREADER () a renvoyé un null.

Re-attribuer la permission corrigée ceci.


0 commentaires

4
votes

Restomer est correct, il peut renvoyer NULL en potentiel.

Peu importe si une implémentation spécifique pour exécutereader () ne permettra pas de buller une valeur nulle - le fait reste que IDatreader est un objet qui peut contenir (ou point à) null.

  • Et si, à l'avenir, vous décidez d'utiliser une implémentation différente de idbcommand ?
  • Et si la prochaine mise à jour de cette implémentation IDBCOMMND contiendra un flux différent dans le code qui permettra de bulles up null?

    Vous n'avez pas besoin de savoir ce qui se passe à l'intérieur de la mise en œuvre d'une interface afin de l'utiliser correctement - vous devez simplement connaître l'interface, et maintenant l'interface permet à NULL comme valeur de retour en tant que valeur de retour. .


0 commentaires

0
votes

Pour moi, ce n'était pas nul, mais ne produirait rien quand vu dans PowerShell. Cela se produirait lorsque la requête n'a renvoyé aucune ligne de lignes.


0 commentaires