2013-06-21 2 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를 만 내가 사용하는 '루프 동안 할'하고 경우에도 첫 번째 레코드에 대한 읽기 때문이다. 내가 가로 방향의 보고서를 생성 할 더 많은 필드의 수 있습니다으로

:

나는 또 다른 질문이 있습니다. 그래서 보고서의 방향을 변경하는 방법.

저는 Visual Studio 2005와 MS-Access 2007을 사용하고 있습니다. 프로그래밍 언어는 VB.NET입니다. 데이터에 관한

+0

데이터 보관함의 결과에 두 개 이상의 레코드가 포함되어 있는지 확인 했습니까? –

+0

예 ... 35 개의 레코드가 있습니다 – Harabati

답변

0

, 내가 방법 OleDbDataReader에서 데이터를 얻을 수있는 표준 방법은 데이터 테이블을 채우기 위해 사용하는 것입니다 생각,이 시도 :

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