2014-02-12 33 views
0

我正在使用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 

回答

3

但是,你正在阅读这两个数据案例。您可以调用ExecuteReader,然后在测试HasRows之前立即调用Read。摆脱第一次阅读电话和您的循环将按预期工作。第一个代码会失败,因为它根本不会调用Read。

+0

不知何故,我讨厌什么时候指出我的愚蠢......谢谢你 – nutsch

+1

并不意味着你一直很愚蠢,坚强 - 我们都有时刻在看着我们自己的代码后看不到明显的东西时间过长。有时只需要一双新鲜的眼睛,就是这样。 – sh1rts