2013-06-21 93 views
0

我想從多個表中檢索數據並想要生成水晶報告。因此,我創建了一個新表,並在每次需要生成報告時在其中插入值。所以我使用下面的代碼從這些表中檢索數據。無法使用數據採集器讀取下一條記錄

代碼:

Private Sub gen_Report() 

    Dim dr, dr1, dr2 As OleDb.OleDbDataReader 
    Dim cmd, cmdDel, comm_inv1, comm_invuser As OleDb.OleDbCommand 

    If cnnOLEDB.State = ConnectionState.Closed Then 
     cnnOLEDB.Open() 
    End If 
    Dim strDelInsRp As String = ("DELETE FROM Inst_Report") 
    cmdDel = New OleDb.OleDbCommand(strDelInsRp, cnnOLEDB) 
    cmdDel.Parameters.AddWithValue("@chlno", cmbChal_no.Text) 
    cmdDel.ExecuteNonQuery() 

    Dim strSelIns As String = ("SELECT * FROM Installation_det where [email protected]") 
    cmd = New OleDb.OleDbCommand(strSelIns, cnnOLEDB) 
    cmd.Parameters.AddWithValue("@chlno", cmbChal_no.Text) 


    dr = cmd.ExecuteReader 
    Try 

     Do While dr.Read = True 

      mach_srno = dr("Machine_SrNo") 
      tft_srno = dr("TFT_SrNo") 
      chl_no = dr("Chalan_No") 
      usernm = dr("User_Name") 
      ins_dt = dr("Date_Of_Installation") 
      war_perd = dr("Warranty_Period") 
      war_till = dr("Warranty_Valid_Till") 

      Dim strSelInv1 As String = ("SELECT * FROM INVOICE_ONE where LAY_NO='VDC' AND [email protected]_no ") 
      comm_inv1 = New OleDb.OleDbCommand(strSelInv1, cnnOLEDB) 
      comm_inv1.Parameters.AddWithValue("@chn_no", chl_no) 

      dr1 = comm_inv1.ExecuteReader 
      If dr1.Read = True Then 

       doc_no = dr1("DOCU_NO") 
       code_no = dr1("CODE_NO") 
       memb_nm = dr1("MEMB_NM") 

       Dim strSelInvUser As String = ("SELECT * FROM INVOICE_USER where [email protected] AND LAY_NO='VDC' AND [email protected]") 
       comm_invuser = New OleDb.OleDbCommand(strSelInvUser, cnnOLEDB) 
       comm_invuser.Parameters.AddWithValue("@code", code_no) 
       comm_invuser.Parameters.AddWithValue("@docno", doc_no) 

       dr2 = comm_invuser.ExecuteReader 

       If dr2.Read = True Then 
        User_add = dr2("ILEN2") & dr2("ILEN3") & dr2("ILEN4") & dr2("ILEN5") 
       End If 
       dr2.Close() 
      End If 
      dr1.Close() 
      Dim strInsRep As String = "INSERT INTO Inst_Report(Mach_srNo,TFT_srNo,Mem_nm,UserNm,Dt_Inst,War_Per,war_till,User_Address) VALUES (@mach_srno,@tft_no,@mem_nm,@uname,@inst_dt,@war_per,@war_till,@address)" 
      Dim comm_InsRep As OleDb.OleDbCommand = New OleDb.OleDbCommand(strInsRep, cnnOLEDB) 

      comm_InsRep.Parameters.AddWithValue("@mach_srno", mach_srno) 
      comm_InsRep.Parameters.AddWithValue("@tft_no", tft_srno) 
      comm_InsRep.Parameters.AddWithValue("@mem_nm", memb_nm) 
      comm_InsRep.Parameters.AddWithValue("@uname", usernm) 
      comm_InsRep.Parameters.AddWithValue("@inst_dt", ins_dt) 
      comm_InsRep.Parameters.AddWithValue("@war_per", war_perd) 
      comm_InsRep.Parameters.AddWithValue("@war_till", war_till) 
      comm_InsRep.Parameters.AddWithValue("@address", User_add) 


      comm_InsRep.ExecuteNonQuery() 


     Loop 
     dr.Close() 

    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

但問題是,DataReader的僅爲第一個記錄讀取,即使我使用「do while循環」。

我還有一個問題:

由於場的次數比較多,我想產生橫向方向的報告。 那麼如何改變報表的方向。

我正在使用Visual Studio 2005和MS-Access 2007.並且編程語言是VB.NET。

+0

您是否驗證過您的數據讀取器的結果是否包含多條記錄? –

+0

是的...它包含35條記錄 – Harabati

回答

0

關於你的資料,我相信從OleDbDataReader獲取數據的標準方法是使用它來填充一個DataTable,試試這個:

Private Function GetDataTableUsingDataReader(ByVal command As OleDbCommand) As DataTable 
    Dim dataTable As DataTable = New DataTable 

    Using reader As OleDbDataReader = command.ExecuteReader 
     dataTable.Load(reader, LoadOption.OverwriteChanges) 
    End Using 

    Return dataTable 
End Function 

爲了讓您的水晶報告景觀,右鍵點擊在設計師報告中,goto design =>頁面設置。從這裏你可以改變方向。

+0

非常感謝您.....我正在使用oledbDataReader ...但仍然有問題.. – Harabati

相關問題