SqlDataReader HasRows但不读取
问题描述:
我正在使用SqlDataReader
检索数据库信息以将其放入javascript
字符串中。我得到了SqlDataReader.HasRows=True
,如果我在不读取数据读取器的情况下先调用我的字符串构建,则会得到正确的字符串。如果我试图循环读者,没有任何东西出来。SqlDataReader HasRows但不读取
下面的代码返回正确格式的字符串,但只适用于第一个记录:
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
下面的记录将返回一个空字符串:
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
答
但是,你正在阅读这两个数据案例。您可以调用ExecuteReader,然后在测试HasRows之前立即调用Read。摆脱第一次阅读电话和您的循环将按预期工作。第一个代码会失败,因为它根本不会调用Read。
不知何故,我讨厌什么时候指出我的愚蠢......谢谢你 – nutsch
并不意味着你一直很愚蠢,坚强 - 我们都有时刻在看着我们自己的代码后看不到明显的东西时间过长。有时只需要一双新鲜的眼睛,就是这样。 – sh1rts