But you ARE reading the data in both cases. You call ExecuteReader and then you call Read immediately after that, before testing HasRows. Get rid of that first Read call and your loop will work as you expect. The first code would then fail as it should because you will not be calling Read at all.
SqlDataReader HasRows but doesn't Read
-
10-10-2022 - |
Question
I'm using a SqlDataReader
to retrieve database information to put into a javascript
string. I get SqlDataReader.HasRows=True
, and if I call my string building without reading the data reader first, I get the proper string. If I try to loop on the reader though, nothing comes out.
The following code returns a properly formed string, but only for the first record:
Function sFnLoadCodingLines() As String
Dim cmdCoding As SqlCommand, drCoding As SqlDataReader, con As New SqlConnection(strcon)
Dim sTemp As String = ""
Dim lInvoiceID As Long
If Not IsNumeric(CLng(Page.Request.QueryString("InvoiceID"))) Then
sFnLoadCodingLines = ""
Exit Function
End If
lInvoiceID = CLng(Page.Request.QueryString("InvoiceID"))
cmdCoding = New SqlCommand
cmdCoding.CommandText = "SELECT BU,DEPT,AccNo,Qty,Amount,Description,EMP,VARIETAL,BRAND,STATE,PROJECT " & _
"FROM OI_tblCoding WHERE isDeleted=0 AND InvoiceID=" & lInvoiceID
cmdCoding.Connection = con
con.Open()
drCoding = cmdCoding.ExecuteReader
drCoding.Read()
If drCoding.HasRows() Then
sTemp = sTemp & "addRowToTable(""" & drCoding("BU").ToString & _
""",""" & drCoding("DEPT").ToString & _
""",""" & drCoding("AccNo").ToString & _
""",""" & drCoding("Qty").ToString & _
""",""" & drCoding("Amount").ToString & _
""",""" & drCoding("Description").ToString & _
""",""" & drCoding("EMP").ToString & _
""",""" & drCoding("VARIETAL").ToString & _
""",""" & drCoding("BRAND").ToString & _
""",""" & drCoding("STATE").ToString & _
""",""" & drCoding("PROJECT").ToString & """);" & vbCrLf
sFnLoadCodingLines = sTemp
Else
sFnLoadCodingLines = ""
End If
con.Close()
End Function
The following record returns an empty string:
Function sFnLoadCodingLines() As String
Dim cmdCoding As SqlCommand, drCoding As SqlDataReader, con As New SqlConnection(strcon)
Dim sTemp As String = ""
Dim lInvoiceID As Long
If Not IsNumeric(CLng(Page.Request.QueryString("InvoiceID"))) Then
sFnLoadCodingLines = ""
Exit Function
End If
lInvoiceID = CLng(Page.Request.QueryString("InvoiceID"))
cmdCoding = New SqlCommand
cmdCoding.CommandText = "SELECT BU,DEPT,AccNo,Qty,Amount,Description,EMP,VARIETAL,BRAND,STATE,PROJECT " & _
"FROM OI_tblCoding WHERE isDeleted=0 AND InvoiceID=" & lInvoiceID
cmdCoding.Connection = con
con.Open()
drCoding = cmdCoding.ExecuteReader
drCoding.Read()
If drCoding.HasRows() Then
While drCoding.Read()
'addRowToTable(sBU, sDPT, sAcct, dbQty, dbAmt, sDesc, sEmp, sVar, sBrand, sState, sProj)
sTemp = sTemp & "addRowToTable(""" & drCoding("BU").ToString & _
""",""" & drCoding("DEPT").ToString & _
""",""" & drCoding("AccNo").ToString & _
""",""" & drCoding("Qty").ToString & _
""",""" & drCoding("Amount").ToString & _
""",""" & drCoding("Description").ToString & _
""",""" & drCoding("EMP").ToString & _
""",""" & drCoding("VARIETAL").ToString & _
""",""" & drCoding("BRAND").ToString & _
""",""" & drCoding("STATE").ToString & _
""",""" & drCoding("PROJECT").ToString & """);" & vbCrLf
End While
sFnLoadCodingLines = sTemp
Else
sFnLoadCodingLines = ""
End If
con.Close()
End Function
Solution
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow