I have this SQL:
SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid
SELECT count (1) AS unpublished_drafts FROM users WHERE version_replace = @sid AND moderated = 0
SELECT * FROM users WHERE id = @sid ORDER By ID DESC
Which appears to be correct. However I’m having difficulty extracting the fields from the results. In vb.net I am using this code fragment:
While r.Read()
Dim o_email As String = CStr(r("email"))
Dim o_first_name As String = CStr(r("first_name"))
Dim o_last_name As String = CStr(r("last_name"))
Which is causing this error: System.IndexOutOfRangeException: email
I have checked the sql is being exucuted correctly. The sql I’ve posted is simply replacing a simpler statement which was feeding into the code fragment perfectly.
Why is this and how do I correct it?
the correct way:
While r.Read()
total_drafts = CInt(r("total_drafts"))
End While
r.NextResult()
While r.Read()
unpublished_drafts = CInt(r("unpublished_drafts"))
End While
error_status.Text = total_drafts & " " & unpublished_drafts
r.NextResult()
While r.Read()
Dim o_email As String = CStr(r("email"))
Dim o_first_name As String = CStr(r("first_name"))
Dim o_last_name As String = CStr(r("last_name"))
EDIT:
r.NextResult()instead ofr.ReadNext(),r.ReadNext()is for a DataTableReaderAssuming you are calling the whole sql statement in one go, the problem is that
r.Read()will use the first datatable that is returned for the first statement(SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid), which does not contain the email etc. fields.You have to call
r.NextResult()twice, this will move the datareader to the 3rd dataset that will contain the data fromSELECT * FROM users WHERE id = @sid ORDER By ID DESC