簡體   English   中英

從VB.net連接到SQL數據庫時“行/列沒有數據”

[英]“No data exists for the row/column” when connecting to SQL database from VB.net

我正在嘗試創建一個具有datagridview的程序,當用戶單擊視圖中的單元格時,它會查找SQL數據庫,從同一記錄中的其他字段中獲取信息,並自動填充相應的文本框(完成通過操作表單中的字段名稱)。

但是出於某種原因,我收到一條錯誤消息:“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 Express中查看錯誤的視圖: http://i.imgur.com/9QOQHI1.png

'dgvResults.CurrentCell.Value'的值是從數據庫中取出的電影的名稱(例如“12年奴隸”)。

我究竟做錯了什么?

謝謝,
C。

問題是由傳遞給讀者的strFields(intCount)的值引起的。 它不是有效的列索引。

您可能希望在再次在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循環不再需要它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM