2014-02-12 32 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