2013-11-20 2 views
0

Я пытаюсь создать программу, которая имеет datagridview, когда пользователь нажимает на ячейку в представлении, тогда она выглядит база данных SQL, захватывает информацию из других полей в той же записи и автоматически заполняет соответствующие текстовые поля (сделанные путем манипулирования именем поля) в форме.«Нет данных для строки/столбца» при подключении к базе данных SQL из VB.net

По некоторым причинам однако, я получаю сообщение об ошибке, говорящее: «InvalidOperationException было необработанное» «существует Нет данных для строки/столбца»

Вот код отношение к этой части программы :

Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvResults.CellMouseClick 
    ' Set values in the text boxes to both corresponding to the film. 
    Dim strFields() As String = {"ID", "fName", "fGenre", "fSynopsis", "fAgeRating", "fActorsActresses", "fWebRating", "fNoReservations", "fWeeksRunning"} 

    Dim Con = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ApplicationData.accdb;Persist Security Info=False;") 
    Con.Open() 'Open the connection 
    Dim Cmd As New OleDbCommand(StringBuilderCommand("*", "Films", dgvResults.CurrentCell.Value, "fName"), Con) 'Create a string by calling the StringBuilderCommand to combine the parameters together with quotes. 

    Cmd.CommandType = CommandType.Text 
    Dim Rdr As OleDbDataReader = Cmd.ExecuteReader() 

    Dim intCount As Integer = 4 ' Create a loop variable. 
    Do While Rdr.Read() Or intCount < 6 ' While this statement is 'TRUE', e.g. there is a valid record. 

     strResult = "txt" & strFields(intCount).Replace("f", "") 'Remove any instances of 'f', e.g. the prefix of the string. 

     txtActorsActresses.Text = StringBuilderCommand("*", "Films", dgvResults.CurrentCell.Value, "fName") 
     Me.Controls(strResult).Text = Rdr.Item(strFields(intCount)) ' Suspect the error lies here. 

     'Set the text-box to the correct value from the database. 
     'This will allow me to go through several text boxes, and grab their corresponding values from the database. 

     intCount = intCount + 1 

     'Current error is because it cannot find any data beyond the first field taken. 
     'I have no idea why this is. But if I change the starting intCount value, it will successfully take a different value. 
    Loop 

    Rdr.Close() 'Cleaning up. 
    Cmd.Dispose() 
    Con.Close() 

    WebBrowser1.Navigate(dgvResults.CurrentCell.Value.Replace(" ", ".") & ".movie.poster.new.jpg.to") 'Grab the movie poster off the internet corresponding to the films name. 
End Sub 

Private Function StringBuilderCommand(Field, Table, CurrentCellValue, SearchParameter) 
    'Creates a suitable SQL string. 
    Dim MyStringBuilder As New StringBuilder("SELECT ") 
    MyStringBuilder.Append("*") ' Append the parameter 'Field'. 
    MyStringBuilder.Append(" FROM ") ' Append the SQL command 'FROM'. 
    MyStringBuilder.Append(Table) ' Append the parameter 'Table'. 
    MyStringBuilder.Append(" WHERE ") ' Append the SQL command 'WHERE'. 
    MyStringBuilder.Append(SearchParameter) ' Append the parameter 'SearchParameter'. 
    MyStringBuilder.Append("=""") 
    MyStringBuilder.Append(CurrentCellValue) ' Append the parameter 'CurrentCellValue', representing the cell selected. 
    MyStringBuilder.Append("""") 'Append a quotation mark. 

    Return MyStringBuilder.ToString() ' Return it to the main program. 

End Function 
таблица

базы данных подключен к: http://i.imgur.com/rN0zFwG.png

вид на ошибки, как это выглядит в Visual Studio 2012 Экспресс: http://i.imgur.com/9QOQHI1.png

Значение 'dgvResults.CurrentCell.Value' - это название фильма, взятого из базы данных (например, "12 лет рабства").

Что я делаю неправильно?

Спасибо,
C.

+0

Ошибка довольно описательная: убедитесь, что столбец/строка, которую вы пытаетесь получить, существует вообще в вашей БД. – varocarbas

+2

Я думаю, что в Do While Rdr.Read() Или intCount <6 вам нужно AND, а не OR –

+0

Хорошая точка по Kostas ... почему вы хотите продолжить чтение за пределами того, что можно прочитать? – varocarbas

ответ

1

Проблема вызвана значением strFields (intCount) вы передаете к читателю. Это недействительный индекс столбца.

1

Вы, вероятно, хотите, чтобы петля на полях, прежде чем снова зацикливание на DataReader(), как:

Do While Rdr.Read() 

    For intCount as Integer = 4 to 6 
     strResult = "txt" & strFields(intCount).Replace("f", "") 
     txtActorsActresses.Text = StringBuilderCommand("*", "Films", dgvResults.CurrentCell.Value, "fName") 
     Me.Controls(strResult).Text = Rdr.Item(strFields(intCount)) 
    Next 

Loop 

Я удалил Dim intCount As Integer = 4, потому что он больше не нужен, так как петли for next.