2014-08-30 4 views
0

본질적으로이 오류가 발생하여 수정하려고 시도했지만 아무 문제가 없습니다. 나는 주변을 둘러 보았고, 그 해결책들 중 어느 것도 나를 도왔다 고 생각하지 않는다. 내가하려는 것은 내 Access 데이터베이스 내의 데이터로 레이블을 채우는 것입니다. 그러나 필요한 필드 중 7 개만 채우고 "인덱스가 배열 범위 밖에 있습니다"라는 오류 메시지가 표시됩니다. 누구든지 내 VB 코드를 빠르게 살펴보고 손을 줄 수 있습니까?"인덱스가 배열의 경계를 벗어났습니다."VB 오류

Private Sub NR1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NR1.Click 
    Try 

     Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & My.Application.Info.DirectoryPath.ToString() & "\Flix.Accdb;Persist Security Info=False;") 
     If cn.State = ConnectionState.Open Then 
      cn.Close() 
     End If 
     cn.Open() 

     Dim dr1 As OleDbDataReader 
     Dim com1 As New OleDbCommand 
     com1.CommandText = "select [Title],[Poster],[Description],[Classification], [Rating], [Stars], [Director], [MakeYear], [Price], [RunningTime] from tbl_newreleases where ID = '" & "1" & "'" 
     com1.Connection = cn 
     dr1 = com1.ExecuteReader 

     If dr1.Read Then 
      NRTitle.Text = (dr1(9)).ToString() 
      NRPoster.ImageLocation = (dr1(1)).ToString() 
      NRDescription.Text = (dr1(2)).ToString() 
      NRClassification.ImageLocation = (dr1(3)).ToString() 
      NRStars.ImageLocation = (dr1(4)).ToString() 
      lblCast.Text = (dr1(5)).ToString 
      lblDirector.Text = (dr1(6)).ToString 
      lblYear.Text = (dr1(8)).ToString 
      lblPrice.Text = (dr1(10)).ToString 
      lblRunTime.Text = (dr1(7)).ToString 

     End If 
     cn.Close() 
     dr1.Close() 

     Return 
    Catch ex As Exception 
     MsgBox(ex.Message(), MsgBoxStyle.Critical, "Error...") 
    End Try 

End Sub 

답변

1

OleDbDataReader의 지수는 더 dr(10) 자신없는

As per your query 
dr(0) will be the value of [Title] 
dr(1) will be the value of[Poster] 
......... 
dr(9) will be the value of [RunningTime] 

이 존재 귀하의 요청에 따라 존재하지 않는, 따라서 0dr1(10)에서 시작합니다. 다음과 같이 Index Out of Range exception

변경 사항을 확인하시기 바랍니다있어 그 이유는

If dr1.Read Then 
    NRTitle.Text = dr1(8).ToString() 
    NRPoster.ImageLocation = dr1(0).ToString() 
    NRDescription.Text = dr1(1).ToString() 
    NRClassification.ImageLocation = dr1(2).ToString() 
    NRStars.ImageLocation = dr1(3).ToString() 
    lblCast.Text = dr1(4).ToString() 
    lblDirector.Text = dr1(5).ToString() 
    lblYear.Text = dr1(7).ToString() 
    lblPrice.Text = dr1(9).ToString() 
    lblRunTime.Text = dr1(6).ToString() 
End If 
+0

빠른 응답을 보내 주셔서 감사합니다. CommandText에서 dr (10)과 해당 값을 제거하면 같은 예외가 발생하고 인구는 전혀 발생하지 않습니다. 나는 이것에 아주 새롭다, 그래서 나는 너의 도움을 진짜로 평가한다. – farewell

0
select [Title],[Poster],[Description],[Classification], [Rating], 
[Stars], [Director], [MakeYear], [Price], [RunningTime] 
from tbl_newreleases where ID = 

제목 = 0 포스터 = 1 설명 = 2 분류 = 3 평가 = 4 별 = 5 이사 = 6 MakeYear = 7 가격 = 8 상영 시간 = 9

그러나 쿼리는 열 순서에 따라 거의 의미가 없습니다. 예를 들어, RunningTime의 값을 NRTitle.Text에 넣고있는 것처럼 보입니다. Price의 값은 lblYear.txt입니다. 여전히 Sample이 준 응답이 실제로 작동하지 않고 Out of Bound 오류를 방지하는 이유를 설명하지 못합니다. 여전히 시도 실패 할 경우

If dr1.Read Then 
    NRTitle.Text = (dr1(9)).ToString() 
    NRPoster.ImageLocation = (dr1(1)).ToString() 
    NRDescription.Text = (dr1(2)).ToString() 
    NRClassification.ImageLocation = (dr1(3)).ToString() 
    NRStars.ImageLocation = (dr1(4)).ToString() 
    lblCast.Text = (dr1(5)).ToString 
    lblDirector.Text = (dr1(6)).ToString 
    lblYear.Text = (dr1(8)).ToString 
    lblPrice.Text = (dr1(10)).ToString 
    lblRunTime.Text = (dr1(7)).ToString 
End If 

그런

If dr1.Read Then 
    NRTitle.Text = (dr1(0)).ToString() 
    NRPoster.ImageLocation = (dr1(1)).ToString() 
    NRDescription.Text = (dr1(2)).ToString() 
    NRClassification.ImageLocation = (dr1(3)).ToString() 
    NRStars.ImageLocation = (dr1(4)).ToString() 
    lblCast.Text = (dr1(5)).ToString 
    lblDirector.Text = (dr1(6)).ToString 
    lblYear.Text = (dr1(7)).ToString 
    lblPrice.Text = (dr1(8)).ToString 
    lblRunTime.Text = (dr1(9)).ToString 
End If 

을 시도

If dr1.Read Then 
    NRTitle.Text = (dr1("Title")).ToString() 
    NRPoster.ImageLocation = (dr1("Poster")).ToString() 
    NRDescription.Text = (dr1("Description")).ToString() 

... (등 등 대신 서수

End If 

그리고 만약의 이름을 사용 당신은 여전히 ​​Out of Bounds 오류를 얻습니다. IF 문을보고 어떤 행이 CATCH 블록으로 점프하는지 확인하십시오. 그것은 그 후 아직도 불분명 경우, 모든 I는 다음과 제안 할 수 있습니다 :

1) 사용중인 데이터베이스 엔진에서 쿼리를 실행하여 작동 확인하고 값이 NULL로 표시되는지 확인

IF 문에서 각 라인에 대한

2) 먼저 표시하는 코드 하나 하나 약간 다르게 (예)가 여전히 그 후 실패하면

dim NRTitleValue as string = trycast(dr1(0),string)  
if NRTitleValue is nothing then 
    NRTitle.text = "" 
else 
    NRTitle.Text = NRTitleValue 
end if 

, 당신은 버그를 가질 수있는의와 같은 I 코드 원숭이로 여러 해 동안 보지 못했어요! 행운을 빈다.

관련 문제