 <p>If the reader is reporting <code>true</code> from <code>Read()</code>, then your stored procedure is definitely returning a row (or rows).</p> <p>If you call the SP directly (SSMS etc), that will quickly tell you whether a row is returned. A row with a null in every column <strong>is still a row</strong>. Two options:</p> <ul> <li>fix the SP such that it doesn't return rows incorrectly (I'm guessing it is selecting into variables. And then selecting the variables: that will always yield a row)</li> <li>change the reader code to ignore impossible data</li> </ul> <p>For example. If the first column must be non-null for a "real" row, then simply:</p> <pre><code>if(!reader.IsDBNull(0)) Count++; </code></pre> <p>Which ignores the row if the first cell is null.</p>