In case anyone comes across this post, I did find a solution.
Essentially, the interface hints that a database vendor will know
whether a SQL generated results and that some or all of those results
will exist in memory. Personally, I think this is a mistake and
assumes too much about a vendor's capabilities. Especially in my
situation where I really do not know whether I have records until after
I start reading the file.
It is not practical for me to read everything into memory. So, I
decided that I would create a buffer. I will only parse 5 or so
records at a time. When I parse, I do not actually move the buffer
pointer forward. That way I can parse a few records and see if they
exist, without actually "reading" them out of existance.
This was pretty tricky because if I encounter bad data, I do not want
to throw immediately. It is more intuitive if an error occurs while
the user is looking at the bad data. Eventually, I ended up using a
buffer, but it could only hold one record at a time. It seems strange,
but it definitely works.